异想天开

What's the true meaning of light, Could you tell me why

stringstream重复使用清除标志位

日期:2014-04-29 20:02:23
  
最后更新日期:2014-04-29 20:02:23
之前踩过这个坑,今天差点又踩了。想直接用stringstream直析取整数和string对象,今天直接在调用前用clear方法,以为这样可以清除stringstream里面的内容,后来的结果却不是这样。测试例子如下: [code lang="cpp"]
// g++ -Wall test.cpp -o test
#include<iostream>
#include<sstream>
#include<fstream>
using namespace std;
int main()
{
int foo,bar;
stringstream ss;
ss<<"hello";
ss<<"world";
ss.str("");
ss<<666;
ss>>foo;
cout<<"foo:"<<foo<<endl;
cout<<"stringstream state:"<<ss.rdstate()<< "eof:"<<std::ifstream::eofbit<<endl;
ss.clear();
ss<<555;
cout<<"stringstream state:"<<ss.rdstate()<< "eof:"<<std::ifstream::eofbit<<endl;
ss>>bar;
cout<<"bar:"<<bar<<endl;
return 0;
}
[/code]
打印当前的stringstream状态。当注释掉ss.clear(),也就是不手工清除标志位时,后面的bar的值就不是555。stringstream对象构造的时候,rdstate是goodbit(这个值为0),后面里面内容全部取出来后,就会设置eof(该值为2)。重复使用时,这个状态就会报错。具体细节,感兴趣的话,要么自己down一份gnu c++源码,gdb跟踪一下,或看《c++源码剖析》。过了。