【轉載】C++中替代sprintf的std::ostringstream輸出流詳解


1、簡單介紹
ios

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

派生關係圖:測試

ostringstream派生關係

2、ostringstream的基本使用spa

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

 

有時候,咱們須要格式化一個字符串,但一般並不知道須要多大的緩衝區。爲了保險經常申請大量的緩衝區以防止緩衝區太小形成字符串沒法所有存儲。這時咱們能夠考慮使用ostringstream類,該類可以根據內容自動分配內存,而且其對內存的管理也是至關的到位。取得std::ostringstream裏的內容能夠經過str()和str(string&)成員函數。.net

3、注意事項code

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

例如會有以下誤用:blog

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

4、代碼測試ip

#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;
}

運行結果以下:

ostringstream運行結果

 

轉載地址:http://blog.csdn.net/lanxuezaipiao/article/details/16358159

相關文章
相關標籤/搜索