【问题标题】:Reading EOF with getline(std::cin, variable) - C++使用 getline(std::cin, variable) 读取 EOF - C++
【发布时间】:2017-08-29 00:31:00
【问题描述】:

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))”?

【问题讨论】:

  • 因为如果getline() 遇到文件结束条件,它会将流设置为失败状态,并且在布尔上下文中它将评估为falsecin.eof() 永远不会被检查。
  • 从好的方面来说,如果getline(cin,line) 失败,你无论如何都会退出。你不需要它。如果您甚至注意到!cin.eof() 不起作用,那么您一定有其他错误。例如,cin 没有 eof,除非您关闭输入流。如果没有其他事情发生,getline 将一直等待用户继续输入。尝试 ctrl + z 或 ctrl + d。一个是 Windows,另一个是 Linux。不记得是哪个了。
  • EOF 不起作用”不是一个有用的问题描述。确切地说,您的程序的输入是什么?结果是什么?你的预期结果是什么?请参阅How to Askminimal reproducible example 了解更多信息。
  • 例如,如果 STDIN 已被重定向到输入文件,那么 EOF 是有意义的,但 std::getline() 仍然会处理这种情况。所以还是没有必要手动检查!cin.eof()

标签: c++ string queue getline eof


【解决方案1】:

您可以执行 while(getline(cin, line)) 实际上 &amp;&amp; !cin.eof() 什么都不做,正如 Sam Varshavchik 所指出的那样,因为 getline 完成所有工作并通过将流设置为退出 while 循环一个失败的状态本身,因此,cin.eof 永远不会被处理。

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

cplusplus.com 的文档中对此进行了说明

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2021-03-24
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多