【转载】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

相关文章
相关标签/搜索