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
相关产品推荐
相关产品推荐

