如果 C++ stdlib 流的解析数字紧跟非空格字符,如何引发错误
How to raise an error, if the parsed number of a C++ stdlib stream is immediately followed by a non whitespace character?
在下面的示例中,我没想到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"
时。
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 防止在字符数组中输入双倍空格在 C++
- C++完全复制要字符串的字符列表,而不会忽略多个空格
- 将空格作为单字符数据类型的输入?
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- iStream 运算符跳过空格字符
- 从字符数组中删除双空格
- 循环以从字符数组中删除过多的空格 (C++)
- 在字符名称 c++ 中留出空格
- 检查字符串中的小写字符或空格.布尔值不起作用
- CIN 双精度和不带空格的字符串会导致错误
- 在 C++ 中输入带有空格的字符数组
- 如何将字符串拆分为一组 3 个字符,它们之间有空格
- 在字符串中的字符前添加空格C++插入函数
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- QString 从行首或行尾修剪非空格字符
- 回文,不包括特殊字符和空格
- 将字符串分为连续的非空格字符的序列