sstream

C++中的ssstream

本文学习自

博客1

博客2

C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。

1
#include<sstream>

istringstream类用于执行C++风格的串流的输入操作。
ostringstream类用于执行C风格的串流的输出操作。
stringstream类同时可以支持C风格的串流的输入输出操作。

istringstream类是从istream和stringstreambase派生而来,

ostringstream是从ostream和 stringstreambase派生而来,

stringstream则是从iostream类和stringstreambase派生而来。

继承关系如下图

istringstream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <sstream>

using namespace std;

int main()
{
istringstream istr;
istr.str("1 56.7");
//上述两个过程可以简单写成 istringstream istr("1 56.7");
//str()成员函数的使用可以让istringstream对象返回一个string字符串
// 例如本例中的输出操作 cout<<istr.str(); 。
cout << istr.str() << endl;
int a;
float b;
istr >> a;
cout << a << endl;
istr >> b;
cout << b << endl;
return 0;
}
/*
输出:
1 56.7
1
56.7
*/

上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入”赋值”操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。

ostringstream

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下:
ostringstream::ostringstream(string str);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
ostringstream ostr;
ostr.str("abc");
//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据
ostr.put('d');
ostr.put('e');
ostr.put('f');
ostr.put('g');
ostr<<"hi";

string gstr = ostr.str();
cout<<gstr;
}
//输出 defghi

在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据

但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

stringstream

它是用于C++风格的字符串的输入输出的。 stringstream的构造函数原形如下:

stringstream::stringstream(string str);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <sstream>
#include <string>
#include<cstdlib>
using namespace std;

int main()
{
stringstream ostr("ccc");
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;

char a;
ostr>>a;
cout<<a;
}
/*
输出
defg
d
*/

stringstream在题目中常常用来做字符串切割

1.

1
2
3
4
5
6
7
8
9
10
//每次读取一行字符串,一直读到空串为止
while(getline(cin,s))
{
if(!s.size())
break;
//假设输入每行有两个单词,那么就可以利用stringstream的特性读入两个字符串,以空格为间
stringstream ss(s);
ss>>word1>>word2;
//.....
}

2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <sstream>
using namespace std;
//可以先用 clear( )以及 str( ) 將指定字串設定成一开始的內容,再用 >> 把个別的资料输出,例如:
int main()
{
string s;
stringstream ss;
int a, b, c;
getline(cin, s);
ss.clear();
ss.str(s);
ss >> a >> b >> c;
cout<<a<<" "<<b<<" "<<c<<" ";
}

使用stringstream对象简化类型转换

1.int 到string的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string>
#include <sstream>
#include <iostream> 
using namespace std;
int main()
{
    stringstream stream;
    string result;
    int i = 1000;
    stream << i; //将int输入流
    stream >> result; //从stream中抽取前面插入的int值
    cout << result << endl// print the string "1000"
}

2.string到int的转换

1
2
3
4
string result=”10000”;
int n=0;
stream<<result;
stream>>n;//n等于10000

3.连接string和int,使其成为一个整体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string name = "Bob";
int age = 22;
stringstream ss;
ss<<"Name is : "; //把"Name is : "字符串输入到ss中去
ss<<name; //把name输入到ss中去
ss<<"; Age is : "; //把"; Age is : "字符串输入到ss中去
ss<<age; //把 int类型的age加入到ss中去
string info = ss.str();
cout<<info<<endl;
/*
我们可以直接用+连接两个字符串,但是没用办法用+ 连接int和string类型,stringstream帮我们做到了
*/
}
//输出: Name is : Bob; Age is : 22

4.int 转换为char

1
2
3
4
5
6
7
8
9
10
11
12
#include<sstream>
#include<iostream>
using namespace std;
int main()
{
stringstream stream;
char result[8];
int number = 8888;
stream << number; //向stream中插入8888
stream >> result; //抽取stream中的值到result
cout << result << endl; // 屏幕显示 "8888"
}

5.进行多次转换,必须调用stringstream的成员函数clear()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream stream;
int first,second;
stream << "456";//插入字符串
stream >> first;//转换成int
cout << first <<endl;
stream.clear();//在进行多次转换前,必须清除stream
stream << true;//插入bool值
stream >> second ;//提取出int
cout << second << endl;
}
/*
输出:
456
1
*/
/*
如果没有clear
那么会出现下面的结果
456
43 //不知所云
*/
-------------本文结束,感谢您的阅读-------------