【问题标题】:getline() not working on redirected Linux standard inputgetline() 不适用于重定向的 Linux 标准输入
【发布时间】:2016-11-22 05:36:59
【问题描述】:

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

./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 &gt;&gt; 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:
...

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

【问题讨论】:

  • 我应该补充一点,我也试过getline(cin, throwAwayString)而不是cin.ignore(),但无济于事。
  • myString 是字符串还是字符数组?
  • @Eugene 是来自 C++ 标准库的字符串,和我在上一条评论中试过的throwAwayString 一样
  • 编译所有警告和调试信息(例如g++ -Wall -Wextra -g)然后使用调试器gdb)找出myString的值。仔细阅读documentation
  • @BasileStarynkevitch 使用gdb,第一次显示myString是"",然后在输入中被关闭了一个

标签: c++ linux getline


【解决方案1】:

好的,我想通了!就像 Basile Starynkevitch 建议的那样,问题不在于我的代码,而在于输入文件。我在我的 Windows 笔记本电脑上编写了输入文件并从 Linux 虚拟机上运行它,但对于导致错误的 DOS 行结尾存在一些混淆。

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

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

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

【讨论】:

  • 一些编辑器(特别是 Notepad++)允许配置行尾。
【解决方案2】:

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

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

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

【讨论】:

  • cin 不起作用,因为我需要获取数据行,我正在程序中使用这些数据。必须是getline()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多