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

來源:互聯網
上載者:User

一、簡單介紹

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指向的記憶體已被析構!!

四、代碼測試

<span style="font-size:18px;">#include <sstream>    

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

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

運行結果如下:

作者:csdn部落格 lanxuezaipiao

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.