C++ stringstream的用法

1、介绍

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

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

istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来,stringstream则是从iostream类和stringstreambase派生而来。
他们的继承关系如下图所示:

C++ stringstream的用法

2、istringstream

istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下:

1 istringstream::istringstream(string str);

示例代码如下:

 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; //输出:1 56.7
12     int a;
13     float b;
14     istr >> a;
15     cout << a << endl; //输出:1
16     istr >> b;
17     cout << b << endl; //输出:56.7
18     return 0;
19 }

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

3、ostringstream

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

1 ostringstream::ostringstream(string str); 

示例代码如下:

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

在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

4、stringstream

对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。
stringstream的构造函数原形如下:

1 stringstream::stringstream(string str);

示例代码如下:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 #include<cstdlib>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     stringstream ostr("ccc");
10     ostr.put('d');
11     ostr.put('e');
12     ostr << "fg"; //stringstream对象做输入流
13     string gstr = ostr.str();
14     cout << gstr << endl; //输出:defg 
15     
16     char a;
17     ostr >> a; //stringstream对象做输出流
18     cout << a; //输出:d 
19 }

4.1 stringstream用于数据类型转换

stringtream最常用于string与各种内置数据类型的转换。
示例代码如下:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 #include<cstdlib>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     stringstream sstr;
10     //--------int转string-----------
11     int a = 100;
12     string str;
13     sstr << a;
14     sstr >> str;
15     cout << str << endl; //输出:100 
16     //--------string转char[]--------
17     sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
18     string name = "test";
19     char cname[200];
20     sstr << name;
21     sstr >> cname;
22     cout << cname;//输出:test 
23 }

string转double/int:

 1 #include <iostream>
 2 #include <sstream>
 3 using namespace std;
 4  
 5 int main()  
 6 {  
 7     double  dVal;    
 8     int     iVal;
 9     string  str;
10     stringstream ss;
11     
12     // string -> double
13     str = "123.456789";  
14     ss << str;
15     ss >> dVal;
16     cout << dVal << endl;//输出:123.457 
17  
18     // string -> int
19     str = "654321";
20     ss.clear();
21     ss << str;
22     ss >> iVal;
23     cout << iVal << endl;//输出:654321 
24         
25     return 0;  

 

参考链接:https://blog.csdn.net/liuweiyuxiang/article/details/89070296

原文链接: https://www.cnblogs.com/john1015/p/13216702.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ stringstream的用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/360696

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午1:27
下一篇 2023年3月2日 下午1:27

相关推荐