如果 C++ stdlib 流的解析数字紧跟非空格字符,如何引发错误

How to raise an error, if the parsed number of a C++ stdlib stream is immediately followed by a non whitespace character?

本文关键字:字符 空格 错误 何引发 stdlib C++ 数字 如果      更新时间:2023-10-16

在下面的示例中,我没想到1.2345foo会被解析。由于我正在读取数据文件,因此最好引发错误并通知用户。

在这里做peek()正确的事情吗?

#include <iostream>
#include <sstream>
int main()
{
  std::stringstream in("1.2345foo");
  double x;
  in >> x;
  if (in) {
    std::cout << "goodn";
  }
  else {
    std::cout << "badn";
  }
}

输出

good

只需向前看下一个字符。 在隔离std::istringstream,您可以执行以下操作:

if ( in >> x && in.get() == std::string::traits_type::eof() ) {
    //  good
} else {
    //  bad
}

(我通常喜欢将测试分开,以便提供更多有意义的错误消息。

如果您关心较大文件中的数据,则示例"1.2345 foo"是合法的,但"1.2345foo"不是,您可以使用前瞻,如下所示:

if ( in >> x 
        && (std::isspace( in.peek() )
            || in.peek() == std::string::traits_type::eof())  ) {
    //  good
} else {
    //  bad
}

编辑:

我忘了提:在第一种情况下,你可能想跳过检查 EOF 之前的空格:

if ( in >> x >> std::ws && in.get() == std::string::traits_type::eof() ) ...

(我经常这样做。 如果字符串输入来自 std::getline ,您确实希望允许尾随空格,因为它是任何查看文件的人都不可见。

最简单的

方法将其读作std::string,然后使用std::stodstd::string转换为double。转换函数将为无效输入引发异常,例如当您向其传递"1.2345foo"时。