gpt4 book ai didi

c++ - 如何测试stringstream operator>>是否解析了错误的类型并跳过它

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:06 30 4
gpt4 key购买 nike

我有兴趣讨论使用 stringstream 解析具有多种类型的行的方法。我将从查看以下行开始:

"2.832 1.3067 nana 1.678"

现在让我们假设我有一长行有多个 stringsdoubles。解决这个问题的明显方法是标记字符串,然后检查每个字符串的转换。我有兴趣跳过第二步并直接使用 stringstream 来仅查找数字。

我认为解决此问题的一个好方法是通读字符串并检查是否设置了 failbit,如果我尝试将字符串解析为 double 值,它就会设置。

假设我有以下代码:

string a("2.832 1.3067 nana 1.678");

stringstream parser;
parser.str(a);

for (int i = 0; i < 4; ++i)
{
double b;
parser >> b;
if (parser.fail())
{
std::cout << "Failed!" << std::endl;
parser.clear();
}
std::cout << b << std::endl;
}

它将打印出以下内容:

2.832
1.3067
Failed!
0
Failed!
0

我对它无法解析字符串并不感到惊讶,但是内部发生了什么导致它无法清除其failbit 并解析下一个数字?

最佳答案

以下代码可以很好地跳过坏词并收集有效的double

istringstream iss("2.832 1.3067 nana 1.678");
double num = 0;
while(iss >> num || !iss.eof()) {
if(iss.fail()) {
iss.clear();
string dummy;
iss >> dummy;
continue;
}
cout << num << endl;
}

这是一个 fully working sample .


你的样本几乎是正确的,它只是在检测到格式错误后从流中消耗无效的输入字段而已

 if (parser.fail()) {
std::cout << "Failed!" << std::endl;
parser.clear();
string dummy;
parser >> dummy;
}

在您的情况下,提取将尝试再次从 "nana" 读取最后一次迭代,因此输出中的最后两行。

另请注意有关 iostream::fail() 的技巧以及如何在我的第一个示例中实际测试 iostream::eof()There's a well known Q&A ,为什么将 EOF 作为循环条件的简单测试被认为是错误的。它回答得很好,如何在遇到意外/无效值时打破输入循环。但是那里没有解释(也没有要求)如何跳过/忽略无效的输入字段。

关于c++ - 如何测试stringstream operator>>是否解析了错误的类型并跳过它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40331941/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com