Istream提取操作符:如何检测解析失败
istream extraction operator: how to detect parse failure?
如何检测istream提取是否失败?
string s("x");
stringstream ss(s);
int i;
ss >> std::ios::hex >> i;
EDIT——虽然问题标题涵盖了这一点,但我忘了在正文中提到:我真的想检测失败是由于格式不好,即解析,还是由于任何其他io相关问题,以便提供适当的反馈(malformmed_exception ("x")或其他)。
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。
提取该值失败将设置流的"fail"位,该位可以由if (ss.fail())
检测到,或者仅由if (!ss)
检测到。同样,您可以测试>>
操作的结果,因为它返回对流的引用。
这些也将检测其他错误,设置"坏"位;你可以用ss.bad()
来区分它们。
如果你想继续从流中读取,你需要清除状态标志(ss.clear()
)。
提取过程中的错误由内部状态标志表示。您可以通过good()
成员函数检查它们。详见:http://www.cplusplus.com/reference/iostream/stringstream
或者只是使用上面建议的if()
-结构。这是因为流类
首先:感谢您的有用答案。然而,经过一些调查(cfr。cppreference)和验证,似乎检查解析失败的唯一方法是检查ios::failbit
标志,如
const bool parsing_failed = (ss >> ios::hex >> i).rdstate() & ios::failbit ;
虽然建议的istream::operator!
和istream::operator bool
混合了failbit
和 badbit
(参见cplusplusreference)。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 使用CMake检测支持的C++标准
- 检测 ICU 库在 VS2017 中失败
- 检测功能失败static_assert成语
- C++检测习惯用语失败与继承
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 为什么这C++检测T型是否具有空运算符(EDT const&)失败的特征?
- poco :: streamsocket:检测发送失败
- 如何检测 Boost.PropertyTree 的解析/读取失败
- 具有OPENCV的功能检测失败而seg故障
- 在 Windows 上的分配开始失败之前检测内存不足
- OpenCV 错误:调用检测多尺度时断言失败
- Sobel 边缘检测错误(OpenCV 错误:断言失败 (DIMS<=2&&Data&&(无符号)i0)
- 检测升压测试用例是否失败
- Istream提取操作符:如何检测解析失败
- 检测到FD_ACCEPT,但随后调用'accept'失败,并显示 10038 - WSAENOTSOCK
- 如何检测转换是否在 c++0x 中失败
- 调试断言失败!在人脸识别打开Cv的检测和显示功能中