在下面的示例中,我没想到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::stod
将std::string
转换为double
。转换函数将为无效输入引发异常,例如当您向其传递"1.2345foo"
时。