istream抽取操作符:如何检测解析失败?

时间:2011-12-13 12:05:03

标签: c++ parsing istream

如何检测istream提取是否失败?

string s("x");
stringstream ss(s);
int i;
ss >> std::ios::hex >> i;

编辑 - 虽然问题标题涵盖了这一点,但我忘了提到身体:我真的想要检测失败是由于错误的格式化,即解析,还是由于任何其他与IO相关的问题,提供适当的反馈(malformed_exception(“x”)或其他)。

4 个答案:

答案 0 :(得分:9)

if(! (ss >> std::ios::hex >> i) ) 
{
  std::cerr << "stream extraction failed!" << std::endl;
}

就这么简单。

ETA:以下是此测试如何与流的结尾进行交互的示例。

int i;
std::stringstream sstr("1 2 3 4");
while(sstr >> i)
{
    std::cout << i << std::endl;
    if(sstr.eof())
    {
        std::cout << "eof" << std::endl;
    }
}

将打印
1
2
3
4
EOF

如果您在while循环条件中检查sstr.eof()sstr.good(),则不会打印4。

答案 1 :(得分:4)

无法提取值将设置流的“失败”位,可由if (ss.fail())if (!ss)检测到。同样,您可以测试>>操作的结果,因为它返回对流的引用。

这些还会检测其他错误,这些错误会设置“坏”位;你可以用ss.bad()来区分这些。

如果要继续从流中读取,则需要清除状态标志(ss.clear())。

答案 2 :(得分:0)

提取期间的错误由内部状态标志指示。 您可以通过good()成员函数进行检查。 另见:http://www.cplusplus.com/reference/iostream/stringstream

或者只使用上面建议的if() - 构造。 这是由于流类的bool强制转换操作符

答案 3 :(得分:0)

首先:感谢有用的答案。但是,经过一些调查(cfr。cppreference)和验证后,检查解析失败的一种方法似乎只是检查ios::failbit标志,如

const bool parsing_failed = (ss >> ios::hex >> i).rdstate() & ios::failbit ;

虽然建议的istream::operator!istream::operator bool混合failbit badbit(cfr herethere在cplusplusreference上。)