从重定向到STDIN的文件中检测C ++中的EOF

时间:2010-11-28 05:24:54

标签: c++ file io eof

执行命令:

./program < input.txt

使用以下代码检查:

string input;
while(cin) {
  getline(cin, input);
}

上面的代码似乎生成了一个额外的getline()调用,其中输入为空。无论input.txt的最后一行是否有\n,都会发生这种情况。

3 个答案:

答案 0 :(得分:7)

@Jacob有正确的解决方案但由于某种原因删除了他的答案。这是循环中发生的事情:

    检查
  1. cin是否有任何失败位(BADBIT,FAILBIT)
  2. cin报告没有问题,因为尚未从文件中读取任何内容。
  3. 调用
  4. getline来检测文件结束,设置EOF位和FAILBIT。
  5. 循环再次从1开始执行,但此时退出。
  6. 你需要做这样的事情:

    std::string input;
    while(std::getline(std::cin, input))
    {
         //Have your way with the input.
    }
    

答案 1 :(得分:3)

这个怎么样:

string input;
while(getline(cin, input)) {
  //do something with input...
}

答案 2 :(得分:1)

编辑:请注意,在下面的示例中,我向您展示了“如何检测EOF”。正如@Billy指出的那样,您可能希望使用good()而不是eof()来检测任何错误条件 eof。我在答案的最后列出了有关这方面的信息,但这很重要,所以我在顶部添加了这个注释,以确保它清晰。

(原始答案如下)


你想要这个:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}

operator!上使用iostream仅检查是否发生了故障或其他错误情况。 ios::operator!()

您可以使用good()代替!eof()来检查eofbadbitfailbit的任何条件。 ios::good()