![](/img/trans.png)
[英]Using cin for keyboard input after processing redirected file input with getline
[英]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.