我想测试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);
}
答案 0 :(得分:7)
istream类有一个eof位,可以使用is.eof()
成员进行检查。
编辑:那么你想看看下一个字符是否是EOF标记而不从流中删除它? if (is.peek() == EOF)
可能就是你想要的。请参阅istream::peek
答案 1 :(得分:4)
那是不可能的。 IsEof
函数如何知道您打算读取的下一个项目是int?
以下是否也不会触发任何断言?
while(!IsEof(in))
{
int x;
double y;
if( rand() % 2 == 0 )
{
assert(in >> x);
} else {
assert(in >> y);
}
}
也就是说,您可以使用exceptions
方法将“管家”保存在一个地方。
而不是
if(IsEof(is)) Input(is)
试
is.exceptions( ifstream::eofbit /* | ifstream::failbit etc. if you like */ )
try {
Input(is);
} catch(const ifstream::failure& ) {
}
它不会阻止你在“太晚”之前阅读,但它确实消除了在所有功能中if(是>> x)if(is>> y)等的需要
答案 2 :(得分:0)
通常,
if (std::is)
{
}
就够了。还有.good(),. bad(),. fail()以获取更准确的信息
以下是参考链接:http://www.cplusplus.com/reference/iostream/istream/
答案 3 :(得分:0)
有充分理由没有isEof功能:很难以可用的方式指定。例如,运算符>>通常首先跳过空格(取决于标志),而其他一些输入函数则能够读取空格。你如何处理这种情况?从不跳过空格开始?它是否取决于运营商使用的标志>>或不?它会恢复流中的空白区域吗?
我的建议是使用标准惯用法并描述输入失败,而不是仅仅预测它们的一个原因:你仍然需要表征和处理其他原因。
答案 4 :(得分:0)
不,在一般情况下,无法知道下一次读操作是否会达到eof。
如果流连接到键盘,则EOF条件是我将在下一个提示符下键入Ctrl + Z / Ctrl + D. IsEof如何检测到它?