<sstream> 主要用来进行数据类型转换,好比能够将一个int类型的对象存入流中,而后通过流赋值给一个string的对象中,从而实现了int到string的转变,因为 <sstream> 使用 string 对象来代替字符数组,就避免缓冲区溢出的危险;并且,由于传入参数和目标对象的类型会被自动推导出来,因此不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言,<sstream> 更加安全、自动和直接。ios
定义出三个流:数组
保存一串字符串,而且可以分开识别里面的每一个单词。安全
保存,赋值方法:spa
istringstream stream(a); //将字符串a保存到流中
while (stream >> b){cout<<b<<endl;} //将流中的单词一个一个赋值给bcode
重复利用的方法:由于每一此读取结束,都会到流的结尾,因此下次不能正常读取,此处须要用clear()清空,从而使得下一次读取仍是从流的最初的地方开始对象
stream.clear(); //将流的读取位置从新变为开头
stream.str(a); //从新给流赋值字符串
#include<iostream> #include<sstream> //须要包含的头文件 using namespace std; int main() { string a, b; a = "asdas asdas asdfasd fdgbtrhh"; //字符串 istringstream stream(a); //保存一串字符,而且可以处理一串内的各个单词 while (stream >> b) //一个一个的读取流里面的单词 { cout << b << endl; } //当while循环结束,stream已经到达流的末尾 stream.clear(); //若是想要再次使用stream,须要先清空 //此处若是不清空,则仍是流的末尾,在析取内容的时候,首先会判断流的状态,而后再决定是否读取 stream.str(a); //从新给流赋值 system("pause"); return 0; }
将多个字符串保存到一块儿,而后一块输出string
保存输出方法:io
derr << a; //将字符串a保存到流derr中
cout << derr.str(); //将流输出输出容器
#include<iostream> #include<sstream> //须要包含的头文件 #include<vector> using namespace std; int main() { vector<string>a = { "asdas", "asdas", "asdfasd", "fdgbtrhh" }; //字符串 ostringstream derr; //定义流 for (auto &b:a) //用for读取容器中每个字符串 { derr << " " << b; //将每一个字符串保存到derr中 } cout << derr.str(); //将流输出 system("pause"); return 0; }
感受至关于上面两种东西的整合,可是须要注意clear()和str(" ");的使用方法
#include<iostream> #include<sstream> //须要包含的头文件 #include<vector> using namespace std; int main() { vector<string>a = { "asdas", "asdas", "asdfasd", "fdgbtrhh" }; //字符串 stringstream mm; for (auto &b:a) { mm << " " << b; //将每一个单词保存到derr中 } cout << mm.str() << endl; //将保存的单词所有输出 string z = "sdafs adf we awdqd ger rbber"; mm.clear(); //clear并不会清空流中的内容,他只是把对最初最字符串转换类型等操做清除而已 mm<<z; cout << mm.str() << endl; mm.str(""); //str("")才能够清空流中的内容 mm << z; cout << mm.str(); system("pause"); return 0; }
总结:这里主要谈一下,这里我对于clear(),以及str()使用场景的理解;
输入流:
首先:输入流的时侯,必须两个都要使用的,由于str()在这里就是一个赋值操做,将一个新的字符串赋给流,而此时若是不用clear(),则下一次流的读取位置仍然是结尾,尽管流的内容已经改变,可是下次不能读取。
输出流:
由于此时往流里面存入字符串用的是"<<"的方法,因此若是使用str(" ")不用清空的方法(换句话说是将“ ”一个空字符串来从新赋值)。那么再存入东西的时候,则会自动添加到以前流的后面;而此时clear()感受用处不大,由于不论下一次读取位置在哪,都是会把整个流一块输出。
(若是这个地方个人理解错误,还但愿大佬评论指正)