You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何判断stringstream流是否无剩余内容(含空格处理)?

如何判断C++输入流无剩余有效内容?

问题场景

数据格式要求:先输入整数n,接着是n组被括号包裹、以分号分隔的两个整数,示例输入:2 (1;1) (0;3)。需要完成n和n组数据的读取后,确保流中无非空白的剩余内容,否则抛出异常。

之前尝试用iss.rdbuf()->in_avail() != 0判断(iss为std::stringstream),但该方法无法忽略最后一个有效符号后的空白字符,导致误判。

解决方案

方法1:跳过空白后检查流是否到达EOF

利用std::ws操作符跳过所有空白字符(空格、换行、制表符等),之后检查流是否处于EOF状态:

// 假设已完成n和n组数据的读取
iss >> std::ws; // 跳过所有剩余空白
if (!iss.eof()) {
    throw std::runtime_error("输入流存在多余的非空白内容");
}

原理:std::ws会跳过所有空白,若此时流未到EOF,说明存在非空白的有效剩余内容。

方法2:读取剩余内容(适用于stringstream)

直接获取流中跳过空白后的剩余内容,判断是否为空:

std::string remaining;
// 先跳过空白,再读取所有剩余内容
std::getline(iss >> std::ws, remaining);
if (!remaining.empty()) {
    throw std::runtime_error("输入流存在多余内容");
}

方法3:尝试读取单个字符(通用流处理)

跳过空白后尝试读取一个字符,若能读取到则说明有多余内容:

char c;
iss >> std::ws;
if (iss.get(c)) {
    throw std::runtime_error("输入流存在多余的非空白内容");
}

原方法失效原因

rdbuf()->in_avail()返回的是流缓冲区中当前可用的字符总数,包括空白字符。即使流中只剩空格、换行等空白,它也会返回大于0的值,无法区分有效内容和空白,因此不能满足需求。

内容的提问来源于stack exchange,提问作者mcyrill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:22:16