繁体   English   中英

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" (不带引号)的行时,它不会"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:
...

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

好的,我知道了! 就像Basile Starynkevitch所建议的那样,问题不在于我的代码,而在于输入文件。 我在Windows笔记本电脑上编写了输入文件,并从Linux VM上运行了该文件,而对于引起错误的DOS行尾也有些困惑。

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

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

诅咒你炸毁了“标准”开发人员!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM