2

以下代码只是将标准输入回显到标准输出。如果我像这样运行程序./a.out,我可以输入任何内容并且程序运行良好。但是,如果我像这样运行它,./a.out < input.txt我会得到一个无限循环,无论input.txt.

#include <iostream>

using namespace std;

int main() {
  string input;
  while (true) {
    cout << "Type your input: ";
    getline(cin, input);
    cout << input << endl;
  }
  return 0;
}

我究竟做错了什么?

编辑:为了澄清,我希望在输入文件的输入完成后,getline 等待来自标准输入的更多输入。相反,它会在什么都没有时继续读取。

4

3 回答 3

1

您的循环没有终止条件,无论是中断还是在while零件内部。相反,你可能想要这个:

while (getline(cin, input))

这将在输入失败时结束,很可能是由于已达到 EOF。

于 2012-10-14T02:51:16.633 回答
1

您的循环没有终止条件:while (true)在任何情况下都是无限循环 - 也就是说,没有中断/退出/等。在循环体中。

我猜当你使用你的程序来回显时,stdin你按 Ctrl-C 来结束它。使用 运行您的程序./a.out,然后键入 Ctrl-D (EOF):您还将获得一个无限循环。

查看文档getline使用返回值结束循环:

while (getline(cin, input))
于 2012-10-14T02:51:46.370 回答
0

你做错的是你忽略了输入操作的结果,在这种情况下getline

您绝不能忽略输入操作的结果。这样做总是一个编程错误。您无法知道或假设外部数据的状态,因此您必须始终检查输入操作是否成功。如果没有,那么访问声称的输入变量以进行读取通常是错误的,因此您确实需要每次都检查并访问结果之前进行检查。

在本例中,std::getline返回对流对象的引用,您可以将流评估为布尔值。它评估true好像且仅当提取成功时;否则,您不得使用结果(并且可能停止阅读)。

总而言之,代码应该是这样的:

for (std::string line; std::getline(std::cin, line); )
{
    // use "line"
}
于 2012-10-14T02:59:18.967 回答