【问题标题】:getline keeps waiting on standart inputgetline 一直在等待标准输入
【发布时间】:2017-02-15 18:06:13
【问题描述】:

所以我从昨天开始就一直在努力解决这个问题,我检查了这里的多个帖子试图弄清楚这一点,基本上,我试图从标准输入中读取 1 行或更多行到一个字符串变量中然后使用 istringstream 获取整数值。这就是我所拥有的:

string line;
int num;

while(getline(cin, line)){

    istringstream data(line);

    while(data >> num){

        do stuff...
    }
}

但是,外部循环永远不会退出,如果标准输入中没有输入,它只会坐在那里等待并且永远不会真正退出循环,因此程序基本上会暂停,直到输入某些内容,然后再次继续循环.有人可以告诉我为什么 getline 在 stdin 上没有任何内容时不仅会导致退出条件,并且有人可以帮助我解决此问题,我们将不胜感激。

【问题讨论】:

  • 水是湿的,天空是蓝色的原因是一样的:当从标准输入读取时,默认情况下,来自终端控制台,如果没有可用的输入,程序会暂停并等待直到输入输入。这就是 C++ 的工作原理。
  • @SamVarshavchik 是的,但是如果没有更多输入,getline 是否应该导致 while 条件评估为 false?如果没有,那我怎么能做到这一点?
  • @Kakarot 如果您从文件中提供数据(重定向标准输入),它应该终止。
  • getline() 将在错误或文件结束条件下评估 false。由 CTRL-Z 或 CTRL-D 为交互式终端输入指定文件结束条件,具体取决于操作系统。

标签: c++ string getline istringstream


【解决方案1】:

如果标准输入中没有输入,它只是坐在那里等待并且从未真正退出循环,因此程序基本上会暂停,直到输入某些内容,然后再次继续循环。有人可以告诉我为什么当标准输入上没有任何内容时 getline 不仅仅会导致退出条件

它只是按预期运行。 "nothing on stdin" 实际上是什么?你的意思是空输入吗?在这种情况下,您可能希望将循环条件更改为

while(getline(cin, line) && !line.empty()){

也如 cmets 中提到的 CTRL-Z 或 CTRL-D(取决于操作系统)后跟 ENTER 输入可能会结束循环.

【讨论】:

  • 当我在标准输入上什么也没说时,我的意思是例如。如果用户输入 1 2. 2 将是该行的最后一件事,getline 应该停止读取并在此之后终止
  • @Kakarot 如果只有一个空的 ENTER,请按照我的说明更改条件。实际上什么都没有了。
  • @Kakarot 发布minimal reproducible example,重现您声称的行为。你的问题似乎不完整。
  • 我刚刚测试了这个答案。它有效,@kakarot,你没有做错什么。
  • Ctrl-Z 或 Ctrl-D 可能后需要回车。
【解决方案2】:

问题在于标准输入 (cin) 将读取一行,并且由于 getline 返回“真”(引用!= 0),循环将永远继续要求另一行。

如果你想从输入中读取一行,你应该避免while:

string line;
int num;

getline(cin, line)){

istringstream data(line);

while(data >> num){

    do stuff...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多