【问题标题】:Why does std::ws block although the EOF flag is set?尽管设置了 EOF 标志,为什么 std::ws 会阻塞?
【发布时间】:2014-06-20 02:31:36
【问题描述】:

如果我运行以下代码并按一次Ctrl+D,它会打印EOF flag is set,但之后不会退出。显然,std::ws 的第二次调用似乎在等待进一步的输入,虽然设置了内部 EOF 标志。

#include <iostream>

int main()
{
  std::cin >> std::ws;

  if(std::cin.eof())
    std::cout << "EOF flag is set\n";

  std::cin >> std::ws;

  return 0;
}

如果我将第二行 std::cin &gt;&gt; std::ws; 替换为

float f;
std::cin >> f;

程序确实等待,而是立即退出。

标准中有什么可以解释这种差异吗?此外,有什么方法可以让std::ws 表现不同?

【问题讨论】:

  • 可能是编译器错误?
  • @ph4nt0m - 该程序在 VC2013 Express (Windows) 中运行良好。如果有问题,请使用if (std::cin.good()) std::cin &gt;&gt; std::ws;
  • 感谢您检查这一点,@MichaelJ。看起来你的假设是正确的,马特。我正在使用 g++ 4.8.1。

标签: c++ stream iostream


【解决方案1】:

试试这个块:

    while (!std::cin.eof()) {
        std::cin >> std::ws;
    }

std::cout << "EOF flag is set\n";

这重复从cin 读取,而cin.eoffalse

【讨论】:

  • 我会把这个问题留待一段时间,以防有人知道关于这个“错误”的更具体的信息。如果没有,我会接受您的回答作为解决方法。
  • 这不是一种解决方法。实际上,这就是您解决问题的方法,因为您问题中的代码在您到达输入末尾后正在等待输入。到达输入的末尾后,您将不会在 std::ws 中收到任何内容,并且将等待无穷大的输入。很抱歉没有在答案中解释这一点。
  • 但是看看 Michael J 和 Matt McNabb 在他们上面的 cmets 中的建议。使用 VC2013 编译时,std::ws 不会等待进一步的输入。当然,只有其中一种行为是正确的(根据标准)。
  • 嗯,我已经很多年没有使用 C++ 了,但是,我可以告诉你它有很多不同的编译器。我不知道为什么它在 Michael J 的案例中起作用,而且我几乎可以肯定这不是编译器错误,因为我完全期望您遇到的行为。我一直在处理许多语言和许多库,所以,在我看来,MattMcNabb 的编译器有一个错误,而不是你的。
  • @LajosArpad 我没有编译它,我正在评论原帖。我阅读了 C++ 标准,它似乎说如果设置了 eofbit,那么 &gt;&gt; std::ws 应该什么都不做(尽管总是很难确定标准的 iostreams 部分在说什么!)跨度>
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多