• C++ stringstream的用法


    1、介绍

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

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

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

    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

  • 相关阅读:
    期待Eclipse3.4
    Winforms中使用系统托盘图标
    Eclipse下的Struts2开发插件
    彩色 夺冠
    网络&系统
    A Famous Music Composer
    Quick Brown Fox
    解密QQ号——队列
    谁先倒
    bootstrap Table从零开始
  • 原文地址:https://www.cnblogs.com/john1015/p/13216702.html
Copyright © 2020-2023  润新知