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

C++ 检测C+中的EOF+;从重定向到STDIN的文件,c++,file,io,eof,C++,File,Io,Eof,执行命令: ./program < input.txt 上面的代码似乎生成了一个额外的getline()调用,其中输入为空。无论input.txt的最后一行是否有\n,都会发生这种情况。这样如何: string input; while(getline(cin, input)) { //do something with input... } 编辑:请注意,在下面的示例中,我向您展示了“如何检测EOF”。正如@Billy所指出的,您可能希望使用good()而不是eof()来检测任何

执行命令:

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

这样如何:

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

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

(原答覆如下)


你想要这个:

string input;
while( !cin.eof() ) {
   getline(cin, input);
}
使用
操作符iostream上的code>仅检查是否发生了故障或其他错误情况


您可以使用
good()
代替
!eof()
检查是否存在任何条件
eof
badbit
failbit

雅各布找到了正确的答案,但出于某种原因删除了他的答案。以下是您的循环中发生的情况:

  • cin
    检查是否存在任何故障位(BADBIT、FAILBIT)
  • cin
    报告没有问题,因为尚未从文件中读取任何内容
  • 调用
    getline
    ,检测文件结尾,设置EOF位和FAILBIT
  • 循环从1开始再次执行,但这次它退出
  • 您需要这样做:

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

    抱歉,但循环检查EOF永远不是正确答案。循环应该以
    良好
    的形式编写,而不是以
    eof
    的形式编写。最重要的是,它在OP的测试用例中仍然失败(即,
    cin
    尚未达到EOF,因为没有人尝试读取它)。最后,OP从未使用
    操作符在他或她的代码中。@Billy-你读了全部答案吗!?我建议使用
    good()
    而不是
    eof()
    。最初的问题是“检测C++中的EOF…”我的回答清楚了所有条件之间的区别,并清楚地解释了OP问题发生的原因,以及如何解决它。我希望这不值得投反对票。是的,我读了整个答案。但是“这就是你想要的”的断言是不对的——发布的代码不是OP想要的,发布的代码是错误的,并且会导致失败时的无限循环
    而不是
    getline()
    ,因此此解决方案非常有效。谢谢。@Billy ONeal,我取消了删除。@Billy-看一下文档,只检查坏位或故障位,而不是EOF。OP的问题源于这样一个事实:当正常达到EOF时,没有设置BADBIT和FAILBIT——只有EOF。因此循环再次运行--
    getline()
    尝试在EOF读取流,但失败,因此设置FAILBIT。因此,循环退出。你的解决办法行得通,但你的解释不正确。@Lee:同意。固定的@雅各布:+1给你。(虽然@Lee,cpluplus.com有一些错误,这使我不再相信它是权威的来源。然而,在这种情况下,标准似乎是一致的:)@Billy-+1表示修复。。同意cpluplus.com有错误。我很想找到一个索引良好、问题较少的替代方案。有什么建议吗?@Lee reference和都比cplusplus.com更准确。然而,两者都有不准确之处。我倾向于推荐这本书作为替代品。
    std::string input;
    while(std::getline(std::cin, input))
    {
         //Have your way with the input.
    }