C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含<sstream>头文件,通常是用来做数据转换的。
- istringstream类用于执行C++风格的串流的输入操作。
- ostringstream类用于执行C风格的串流的输出操作。
- strstream类同时可以支持C风格的串流的输入输出操作。
istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来, stringstream则是从iostream类和stringstreambase派生而来。
他们的继承关系如下图所示:
示例一:istringstream的使用
1 #include <iostream>
2 #include <sstream>
3
4 using namespace std;
5
6 int main()
7 {
8 istringstream istr;
9 istr.str("1 56.7");
10 //上述两个过程可以简单写成 istringstream istr("1 56.7");
11 cout << istr.str() << endl;
12 int a;
13 float b;
14 istr >> a;
15 cout << a << endl;
16 istr >> b;
17 cout << b << endl;
18 return 0;
19 }
知识兔输出:
1 56.7
1
56.7
知识兔说明:上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。str()成员函数的使用可以让istringstream对象返回一个string字符串。
示例二:ostringstream的使用
1 #include<iostream>
2 #include<sstream>
3 #include<string>
4
5 using namespace std;
6
7 int main(){
8 ostringstream ostr;
9 //ostr.str("abc"); //如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长
10 ostr.put('d');
11 ostr.put('e');
12 ostr<<"fg";
13
14 string gstr = ostr.str();
15 cout << gstr << endl;
16 }
知识兔输出:
defg
知识兔说明:通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。
示例三:stringstream的使用
1 #include<iostream>
2 #include<sstream>
3 #include<string>
4 using namespace std;
5
6 int main(){
7 stringstream ostr("ccc");
8 ostr.put('d');
9 ostr.put('e');
10 ostr<<"fg";
11 string gstr = ostr.str();
12 cout << gstr << endl;
13
14 char a;
15 // string a; // "defg"
16 ostr>>a;
17 cout << a << endl;
18 }
知识兔输出:
defg
d
知识兔示例四:使用stringstream对象简化类型转换
1 #include<iostream>
2 #include<sstream>
3 #include<string>
4 using namespace std;
5
6 template<class T>
7 void to_string(string & result, const T & t)
8 {
9 ostringstream oss;//创建一个流
10 oss<<t;//把值传递到流中
11 result=oss.str();//获取转换后的字符转并将其写入result
12 }
13
14 template<class out_type, class in_value>
15 out_type convert(const in_value & t)
16 {
17 stringstream ss;
18 ss<<t;
19 out_type result;
20 ss>>result;
21 return result;
22 }
23
24 int main()
25 {
26 stringstream sstr;
27 //--------int转string-----------
28 int a = 100;
29 string str;
30 sstr << a;
31 sstr >> str;
32 cout << str << endl;
33
34 //--------string转char[]--------
35 sstr.clear(); //如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
36 string name = "abcde";
37 char cname[200];
38 sstr << name;
39 sstr >> cname;
40 cout << cname << endl;
41
42 //--------调用函数--------
43 string s1;
44 to_string(s1,10.5);//double到string
45 cout << s1 << endl;
46
47 double d;
48 string s="12.34";
49 d = convert<double>(s);
50 cout << "d " << d << endl;
51
52 string salary;
53 salary = convert<string>(100.0);
54 cout << "salary " << salary << endl;
55 }
知识兔输出:
100
abcde
10.5
d 12.34
salary 100
知识兔说明:
函数模板to_string():可以轻松地将多种数值转换成字符串。
函数模板convert():定义一个通用的转换模板,用于任意类型之间的转换。convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型。
如果想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
引用:https://blog.csdn.net/JoeBlackzqq/article/details/7032703