1. 程式人生 > >C++中替代sprintf的std ostringstream輸出流詳解

C++中替代sprintf的std ostringstream輸出流詳解

構造函數 空間 有時 .com content 執行 函數 ext str2

一、簡單介紹

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 <sstream>  
#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

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

C++中替代sprintf的std ostringstream輸出流詳解