字符串流 istringstream 和 ostringstream 的用法

2016-01-22 23:34:08|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++|来源:唯设编程网

stringstream类

描述:该类可以实现istringstream和ostringstream的功能,支持<<、>>运算符,同样也可以实现字符串到其它类型数据的快速转换。

stringstream的构造函数原型如下:

stringstream::stringstream(string str); 

也可以使用字符串对stringstream进行初始化:

stringstream str("1234");  
str.str("1234");//把字符串"1234"存入字符串流中

该类通常用来实现数据转换,也用于将文件数据一次性读入内存进行分析。

举例1:基本数据类型转换为字符串。

/*基本数据类型变字符串*/  
#include <fstream>   
#include <iostream>   
#include <sstream>   
using namespace std;  
int main()  
{  
    /*整型变字符串*/  
    int n = 10;  
    string str;  
    stringstream stream;  
      
    stream << n;  
    stream >> str;  
      
    cout<<str<<endl;  
    stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");否则下面输出10   
  
    /*char* 变 string*/  
    char cStr[10] = "china";  
      
    stream << cStr;  
    stream >> str;  
  
    cout<<str<<endl;  
    system("pause");  
    return 1;  
}

举例2:将字符串转换为基本数据类型

/*字符串变基本数据类型*/  
#include <fstream>   
#include <iostream>   
#include <sstream>   
using namespace std;  
int main()  
{  
    /*字符串 变 double*/  
    double n;  
    string str = "12.5";  
    stringstream stream;  
      
    stream << str;  
    stream >> n;  
      
    cout<<n<<endl;  
    stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");   
  
    /*string 变 char* */  
    string str1 = "china";  
    char cStr[10];  
      
    stream << str1;  
    stream >> cStr;  
  
    cout<<cStr<<endl;//输出china   
    system("pause");  
    return 1;  
}

多次使用stringstream,你需要先调用stringstream的clear()函数,但它并不清空任何内容,只是重置了流的状态标志,下面是一个示例:

#include <iostream>   
#include <sstream>   
using namespace std;  
  
int main(int argc,char *argv[])  
{  
    std::stringstream stream;  
    string str;  
    while(1)  
    {     
        //clear(),这个名字让很多人想当然地认为它会清除流的内容。   
        //实际上,它并不清空任何内容,它只是重置了流的状态标志而已!   
        stream.clear();    
  
        // 去掉下面这行注释,清空stringstream的缓冲,每次循环内存消耗将不再增加!   
        //stream.str("");         
  
        stream<<"sdfsdfdsfsadfsdafsdfsdgsdgsdgsadgdsgsdagasdgsdagsadgsdgsgdsagsadgs";  
        stream>>str;     
  
        //测试输出每次循环,你的内存消耗增加了多少!   
        cout<<"Size of stream = "<<stream.str().length()<<endl;  
        system("PAUSE");  
    }  
  
    system("PAUSE");  
    return EXIT_SUCCESS;  
}

由于stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )。

另外不要企图用 stream.str().resize(0),或 stream.str().clear() 来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果,内存的消耗还在缓慢的增长!,至于stream.flush(),则根本就起不到任何作用。

本文参考:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html

<12>
发表评论0条 】
网友评论(共?条评论)..
字符串流 istringstream 和 ostringstream 的用法