4

以下代码片段旨在尝试使用 stringstream 对象从字符串中提取整数,并检测整数提取是否成功。stringstream 类继承 >> 运算符以返回对 istream 实例的引用。整数提取失败如何导致 myStream 等于 0 而它的 str 成员仍然是 strInput?

stringstream myStream(strInput);
if (myStream >> num){//successfull integer extraction}
else{//unsuccessfull integer extraction
cout<<myStream<<endl;
cout<<myStream.str().c_str()<<endl;}
4

2 回答 2

5

有一个operator bool()or operator void*()for stream,它返回(类似的东西)!fail()- 或者在void *失败时返回 NULL 的情况。所以,如果流没有失败,那很好。operator >>返回对对象的引用,stream因此编译器说“嗯,无法将流对象与真值进行比较,让我们看看我们是否可以制作 a bool,或者void *从它,是的,我们可以,所以让我们使用它。

于 2013-02-10T23:56:13.357 回答
1

答案在于转换std::ios为的运算符(void*在 C++11中用一个运算符替换为转换basic_ios为 abool):

从 ios 派生的流对象可以转换为指针。如果设置了任何一个错误标志(failbit 或 badbit),则该指针为空指针,否则为非零指针。

当您的流用于 、 或 条件时,将调用此if运算whilefor!对于需要编写的情况,还有一个一元运算符

if (!(myStream >> num)) {
    ...
}
于 2013-02-10T23:56:27.433 回答