我正在调试计算机上的文件。我没有使用键盘输入,而是像这样运行程序:
./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:
...
请帮我弄清楚发生了什么!
答案 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"
)时,您无需存储整行。即使用户在这种情况下键入多个单词,编译器也只会输入第一个单词。