std::ostringstream輸出流詳解


一、簡單介紹

ostringstream是C++的一個字符集操作模板類,定義在sstream.h頭文件中。ostringstream類通常用於執行C風格的串流的輸出操作,格式化字符串,避免申請大量的緩沖區,替代sprintf。

派生關系圖:

二、ostringstream的基本使用

ostringstream的構造函數形式:
explicit ostringstream ( openmode which = ios_base::out );
explicit ostringstream ( const string & str, openmode which = ios_base::out );

 

有時候,我們需要格式化一個字符串,但通常並不知道需要多大的緩沖區。為了保險常常申請大量的緩沖區以防止緩沖區過小造成字符串無法全部存儲。這時我們可以考慮使用ostringstream類,該類能夠根據內容自動分配內存,並且其對內存的管理也是相當的到位。取得std::ostringstream里的內容可以通過str()和str(string&)成員函數。

三、注意事項

std::ostringstream::str()返回的是臨時對象,不能對其直接操作。

例如會有如下誤用:

const char *  pBuffer  =  oss.str().c_str();
注意pBuffer指向的內存已被析構!!

四、代碼測試

#include <string>  
#include <iostream>  
using namespace std;  
  
void main()  
{  
    ostringstream ostr1; // 構造方式1  
    ostringstream ostr2("abc"); // 構造方式2  
  
/*---------------------------------------------------------------------------- 
*** 方法str()將緩沖區的內容復制到一個string對象中,並返回 
----------------------------------------------------------------------------*/  
    ostr1 << "ostr1 " << 2012 << endl; // 格式化,此處endl也將格式化進ostr1中  
    cout << ostr1.str();   
  
/*---------------------------------------------------------------------------- 
*** 建議:在用put()方法時,先查看當前put pointer的值,防止誤寫 
----------------------------------------------------------------------------*/  
    long curPos = ostr2.tellp(); //返回當前插入的索引位置(即put pointer的值),從0開始   
    cout << "curPos = " << curPos << endl;  
  
    ostr2.seekp(2); // 手動設置put pointer的值  
    ostr2.put('g');     // 在put pointer的位置上寫入'g',並將put pointer指向下一個字符位置  
    cout << ostr2.str() << endl;  
      
  
/*---------------------------------------------------------------------------- 
*** 重復使用同一個ostringstream對象時,建議: 
*** 1:調用clear()清除當前錯誤控制狀態,其原型為 void clear (iostate state=goodbit); 
*** 2:調用str("")將緩沖區清零,清除臟數據 
----------------------------------------------------------------------------*/  
    ostr2.clear();  
    ostr2.str("");  
  
    cout << ostr2.str() << endl;  
    ostr2.str("_def");  
    cout << ostr2.str() << endl;  
    ostr2 << "gggghh";    // 覆蓋原有的數據,並自動增加緩沖區  
    cout << ostr2.str() << endl;
    ostr2.str("");   // 若不加這句則運行時錯誤,因為_df所用空間小於gggghh,導致讀取臟數據
    ostr2.str("_df");  
    cout << ostr2.str() << endl;

    // 輸出隨機內存值,危險
    const char* buf = ostr2.str().c_str();  
    cout << buf << endl;

    // 正確輸出_df
    string ss = ostr2.str();
    const char *buffer = ss.c_str();
    cout << buffer << endl;
}

運行結果如下:

 

轉自:http://blog.csdn.net/lanxuezaipiao/article/details/16358159


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM