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" 开发者!
我正在调试计算机上的文件。而不是使用键盘输入,我 运行 程序是这样的:
./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" 开发者!