@zhengyuhong
2015-06-10T01:56:30.000000Z
字数 1834
阅读 1247
未分类
typedef basic_istringstream<char> istringstream;
default (1)explicit istringstream (ios_base::openmode which = ios_base::in);initialization (2)explicit istringstream (const string& str,ios_base::openmode which = ios_base::in);copy (3)istringstream (const istringstream&) = delete;move (4)istringstream (istringstream&& x);
具体用法与```ifstream````差不多,都是一个输入流
typedef basic_ostringstream<char> ostringstream;
explicit ostringstream (ios_base::openmode which = ios_base::out);explicit ostringstream (const string& str,ios_base::openmode which = ios_base::out);
具体用法与ofstream差不多,都是一个输出流
template < class charT, // basic_stringstream::char_typeclass traits = char_traits<charT>, // basic_stringstream::traits_typeclass Alloc = allocator<charT> // basic_stringstream::allocator_type> class basic_stringstream;
概念与fstream差不多,既是输入流也是输出流,但是stringstream在类型转换方法上大派用场。
explicit stringstream (ios_base::openmode which = ios_base::in | ios_base::out);explicit stringstream (const string& str,ios_base::openmode which = ios_base::in | ios_base::out);
example
ifstream ifs("a.txt");string str;stringstream ss;int n;while(ifs>>str){ //getline(ifs,str);ss.str(str);//ss.clear()仅仅是情况状态标识,非清空流中字符ss>>n;//以空格、回车为分隔符读取流中字符到ncout<<n<<endl;}ifs.close();
当文件a.txt涉及多种类型数据时,如string,int
张三 99
李四 98
...
可以如下读取
ifstream ifs("a.txt");stringstream ss;string name;int age;string line;while(getline(ifs,line)){ss.clear();//需要先情况stringstream 缓存中的流数据,否则下一个name,age依然是上一轮的值ss.str(line);//将流中数据设置为line,等价于ss.str("");ss<<line;ss>>name>>age;//以空格、回车为分隔符读取流中数据cout<<name<<" "<<age<<endl;}ifs.close();
C语言的fscanf也可以读入数据,经过测试,4亿条数据,使用C++的getline+stringstream耗时81秒,而fscanf耗时18s,在追求效率是fscanf确实快。
#include <cstdio>using std::fscanf;using std::fopen;using std::fclose;int main(int argc, char* argv[]) {FILE* fptr = fopen("a.txt"."r");char name[80];int age;while(fscanf(fptr,"%s%d",name,&age) > 0) {//do sth}fclose(fptr);return 0;}
