使用 getline(std::cin, variable) 读取 EOF - C++

Reading EOF with getline(std::cin, variable) - C++

提问人:Vitor Vidal 提问时间:4/4/2017 最后编辑:user4581301Vitor Vidal 更新时间:4/4/2017 访问量:2795

问:

EOF 不起作用。请帮忙。谢谢!

#include <iostream>
#include <string>
#include <queue>
using namespace std;

int main()
{
    string line; // string
    queue<string> a; // queue for output
    while (getline(cin, line) && !cin.eof())
    { // EOF working?
        for (int i = 0; i < line.size(); i++)
            if (line[i] != ' ' && line[i] % 2 == 0)
                line[i] -= 32;
        a.push(line);
    }
    while (!a.empty())
    {
        cout << a.front() << endl;
        a.pop();
    }
    return 0;
}

为什么我不能做“while(getline(cin, line))”?

C++ 字符串 队列 getline eof

评论

0赞 Sam Varshavchik 4/4/2017
因为如果遇到文件结束条件,它会将流设置为失败状态,并且在布尔上下文中,它的计算结果为 。 永远不会被检查。getline()falsecin.eof()
0赞 user4581301 4/4/2017
从好的方面来说,如果失败了,你还是会退出。你不需要它。如果您甚至注意到不起作用,您一定还有其他错误。例如,除非关闭输入流,否则没有 eof。 如果没有其他事情发生,将等待用户永远继续打字。尝试 ctrl + z 或 ctrl + d。一个是 Windows,另一个是 Linux。不记得是哪个了。getline(cin,line)!cin.eof()cingetline
1赞 Robᵩ 4/4/2017
"EOF 不起作用“不是一个有用的问题描述。确切地说,您的程序的输入是什么?结果究竟是什么?您的预期结果是什么?有关更多信息,请参阅如何提问最小可重现示例
0赞 Remy Lebeau 4/4/2017
例如,如果 STDIN 已重定向到输入文件,则有意义,但无论如何仍会处理该情况。所以仍然没有必要手动检查。EOFstd::getline()!cin.eof()

答:

0赞 Andria 4/4/2017 #1

正如 Sam Varshavchik 所指出的那样,您实际上可以不做任何事情,因为通过自行将流设置为失败状态来执行所有工作并退出 while 循环,因此永远不会处理。while(getline(cin, line))&& !cin.eof()getlinecin.eof

如果在 [输入流] 中到达文件末尾,或者在输入操作期间发生其他错误,则提取也会停止。

这在文档中有说明 cplusplus.com