getline() 无法处理重定向的 Linux 标准输入

getline() not working on redirected Linux standard input

我正在调试计算机上的文件。而不是使用键盘输入,我 运行 程序是这样的:

./main < input.txt

我的程序中有一段代码如下所示:

do {
    cout << "Type \"STOP\" when done: ";
    getline(cin, myString);
    cout << endl;
    if (myString == "STOP") {
        break;
    }
    cout << "Input next line: " << endl;
    getline(cin, myString2);
    cout << endl;

    // do something with the two strings

} while (myString != "STOP");

当文件中有一行等于 "STOP"(无引号)时,它不会停止,而是一直循环下去。早些时候,有一个 cin >> myInt,但我确保在每次调用后都使用 cin.ignore()。如果我在不重定向的情况下输入值,它工作正常。

这是输出:

Type "STOP" when done:
Type "STOP" when done:
Type "STOP" when done:
Type "STOP" when done:
Type "STOP" when done:
Type "STOP" when done:
Type "STOP" when done:
...

请帮我看看这是怎么回事!

尝试简单地使用 cin 命令。例如:

do {
    cout << "Type \"STOP\" when done: ";
    cin >> myString;
    cout << endl;
    if (myString == "STOP") {
        break;
    }
} while (myString != "STOP");

这将消除对 getline() 函数的需要,因为当用户只应键入一个单词 ("STOP") 时,您无需存储整行。即使用户在这种情况下键入多个单词,编译器也只会接受第一个单词。

好的,我明白了!正如 Basile Starynkevitch 所建议的那样,问题不在于我的代码,而在于输入文件。我在 Windows 笔记本电脑上写了输入文件,运行 从 Linux VM 上写了输入文件,并且对导致错误的 DOS 行结尾有一些混淆。

因为 Windows 以 \r\n 终止它们的行,而 *nix 仅以 \n 终止它们,所以 cin.ignore() 忽略了 \r 而不是 \n,正在读入 getline()

解决方案:只需在 Linux 中写入输入文件,或者在您选择的编辑器中使用 "unix" 行结尾(通常类似于 View -> Line Endings -> Unix).

诅咒你诅咒 "standards" 开发者!