我想测试 std::istream
是否已经到达结尾而不读取它。
我知道我可以像这样检查 EOF:
if (is >> something)
但这有一系列的问题。想象有许多(可能是虚拟的)方法/函数期望 std::istream&
作为参数传递。
这意味着我必须做一些检查 EOF 的“家务”,可能使用不同类型的 something
变量,或者创建一些奇怪的包装器来处理调用输入法的情况.
我需要做的就是:
if (!IsEof(is)) Input(is);
IsEof
方法应保证流不会因读取而改变,因此上面的行等同于:
Input(is)
关于在Input
方法中读取的数据。
如果没有通用的解决方案来表示和 std::istream
,有没有办法为 std::ifstream
或 cin 做这个
?
编辑:
换句话说,以下 assert
应该总是通过:
while (!IsEof(is)) {
int something;
assert(is >> something);
}
最佳答案
istream类有一个可以使用 is.eof()
成员检查的 eof 位。
编辑:所以您想查看下一个字符是否是 EOF 标记而不将其从流中删除? if (is.peek() == EOF)
可能就是您想要的。请参阅 istream::peek 的文档
关于C++:std::istream 检查 EOF 而不读取/消耗 token /使用运算符>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5770754/