当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++中替代sprintf的std::ostringstream输出流详解

C++中替代sprintf的std::ostringstream输出流详解

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:786

一、简朴先容

ostringstream是C++的一个字符集操纵模板类,界说在sstream.h头文件中。ostringstream类凡是用于执行C气势气魄的串流的输出操纵,名目化字符串,制止申请大量的缓冲区,替代sprintf。

派生干系图:

C++中替代sprintf的std::ostringstream输出流详解

二、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>    

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

运行功效如下:

C++中替代sprintf的std::ostringstream输出流详解

作者:csdn博客 lanxuezaipiao

 

    关键字:

天才代写-代写联系方式