ostringstream使用

ostringstream使用转载于:https://blog.csdn.net/lanxuezaipiao/article/details/16358159一、简单介绍ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf。派生关系图:二、ostringst…

转载于:https://blog.csdn.net/lanxuezaipiao/article/details/16358159

一、简单介绍

ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf。

派生关系图:

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指向的内存已被析构!!

四、代码测试


  
  
  
  1. #include <sstream>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5. void main()
  6. {
  7. ostringstream ostr1; // 构造方式1
  8. ostringstream ostr2("abc"); // 构造方式2
  9. /*----------------------------------------------------------------------------
  10. *** 方法str()将缓冲区的内容复制到一个string对象中,并返回
  11. ----------------------------------------------------------------------------*/
  12. ostr1 << "ostr1 " << 2012 << endl; // 格式化,此处endl也将格式化进ostr1中
  13. cout << ostr1.str();
  14. /*----------------------------------------------------------------------------
  15. *** 建议:在用put()方法时,先查看当前put pointer的值,防止误写
  16. ----------------------------------------------------------------------------*/
  17. long curPos = ostr2.tellp(); //返回当前插入的索引位置(即put pointer的值),从0开始
  18. cout << "curPos = " << curPos << endl;
  19. ostr2.seekp( 2); // 手动设置put pointer的值
  20. ostr2.put( 'g'); // 在put pointer的位置上写入'g',并将put pointer指向下一个字符位置
  21. cout << ostr2.str() << endl;
  22. /*----------------------------------------------------------------------------
  23. *** 重复使用同一个ostringstream对象时,建议:
  24. *** 1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit);
  25. *** 2:调用str("")将缓冲区清零,清除脏数据
  26. ----------------------------------------------------------------------------*/
  27. ostr2.clear();
  28. ostr2.str( "");
  29. cout << ostr2.str() << endl;
  30. ostr2.str( "_def");
  31. cout << ostr2.str() << endl;
  32. ostr2 << "gggghh"; // 覆盖原有的数据,并自动增加缓冲区
  33. cout << ostr2.str() << endl;
  34. ostr2.str( ""); // 若不加这句则运行时错误,因为_df所用空间小于gggghh,导致读取脏数据
  35. ostr2.str( "_df");
  36. cout << ostr2.str() << endl;
  37. // 输出随机内存值,危险
  38. const char* buf = ostr2.str().c_str();
  39. cout << buf << endl;
  40. // 正确输出_df
  41. string ss = ostr2.str();
  42. const char *buffer = ss.c_str();
  43. cout << buffer << endl;
  44. }


运行结果如下:
ostringstream使用


今天的文章ostringstream使用分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/8640.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注