C ++:std :: istream检查EOF而不读取/使用令牌/使用运算符>>

时间:2011-04-24 13:28:57

标签: c++ filestream iostream eof

我想测试std::istream是否已经到达终点而没有从中读取。

我知道我可以这样检查EOF:

if (is >> something) 

但这有一系列问题。想象一下,有许多(可能是虚拟的)方法/函数希望std::istream&作为参数传递。 这意味着我必须在每个中检查EOF的“家务”,可能使用不同类型的something变量,或者创建一些奇怪的包装器来处理调用输入方法的场景。

我需要做的就是:

if (!IsEof(is)) Input(is);

方法IsEof应保证流不会因读取而改变,因此上述行等同于:

Input(is)

关于Input方法中读取的数据。

如果没有可以说明的通用解决方案std::istream,是否有办法为std::ifstreamcin执行此操作?

修改 换句话说,以下assert应始终通过:

while (!IsEof(is)) {
  int something;
  assert(is >> something);
}

5 个答案:

答案 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如何检测到它?