getline()不能处理重定向的Linux标准输入

时间:2016-11-22 05:36:59

标签: c++ linux getline

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

./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:
...

请帮我弄清楚发生了什么!

2 个答案:

答案 0 :(得分:4)

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

由于Windows使用\r\n终止其行,并且* nix仅使用\n终止它们,因此cin.ignore()忽略了\r而忽略了\n,正在阅读getline()

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

诅咒你抨击“标准”开发人员!

答案 1 :(得分:-1)

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

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

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