为什么这个简单的getInteger函数会导致流失败?

时间:2014-09-13 07:38:14

标签: c++ macos

我一直在使用StanfordCPPLib来完成Eric S. Roberts的“C ++编程抽象”,但simpio.h中的这个功能突然让我感到悲伤。它在过去运作良好,但现在它无论我输入的是什么数字/字母/等,它都会给我“非法整数格式。再试一次。”

我通过从if语句中删除!stream.fail()位来尝试一些调试,它就像一个魅力......但是使用这个函数的一部分原因是检查失败状态。嗯。

自从最后使用这个库以来我唯一能记得做的就是从10.8升级到OSX 10.9

我错过了什么?提前谢谢!

 /*
 * Implementation notes: getInteger, getReal
 * -----------------------------------------
 * Each of these functions reads a complete input line and then uses the
 * <sstream> library to parse that line into a value of the desired type.
 * If that fails, the implementation asks the user for a new value.
 */

int getInteger(string prompt) {
   int value;
   string line;
   while (true) {
      cout << prompt;
      getline(cin, line);
      istringstream stream(line);
      stream >> value >> ws;
      if (!stream.fail() && stream.eof()) break;
      cout << "Illegal integer format. Try again." << endl;
      if (prompt == "") prompt = "Enter an integer: ";
   }
   return value;
}

1 个答案:

答案 0 :(得分:1)

考虑"123"提取的字符串getline,然后将其放入istringstream

stream >> value将提取123,并在流上设置eofbit

然后stream >> ws发生了。指定ws首先构造一个sentry对象,如果is.setstate(failbit)is.good(),则指定其构造函数调用false - 它是{{1}已设置。因此,eofbitstream.fail()true!stream.fail() && stream.eof(),您的代码会打印&#34;非法整数格式&#34;。

在这种情况下,libstdc ++的实现并没有设置false,这似乎是不合格的。

一个简单的解决方法是在failbit

的末尾添加一个尾随空格
line

这可确保始终在未设置 istringstream stream(line + " "); 的情况下调用ws,以便eofbit的构造函数不会设置sentry