std::ostringstream输出流详解
2024-08-28 13:44:23
一、简单介绍
ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf。
派生关系图:
二、ostringstream的基本使用
有时候,我们需要格式化一个字符串,但通常并不知道需要多大的缓冲区。为了保险常常申请大量的缓冲区以防止缓冲区过小造成字符串无法全部存储。这时我们可以考虑使用ostringstream类,该类能够根据内容自动分配内存,并且其对内存的管理也是相当的到位。取得std::ostringstream里的内容可以通过str()和str(string&)成员函数。
三、注意事项
std::ostringstream::str()返回的是临时对象,不能对其直接操作。
例如会有如下误用:
const char * pBuffer = oss.str().c_str();
注意pBuffer指向的内存已被析构!!
四、代码测试
#include <string>
#include <iostream>
using namespace std; void main()
{
ostringstream ostr1; // 构造方式1
ostringstream ostr2("abc"); // 构造方式2 /*----------------------------------------------------------------------------
*** 方法str()将缓冲区的内容复制到一个string对象中,并返回
----------------------------------------------------------------------------*/
ostr1 << "ostr1 " << << endl; // 格式化,此处endl也将格式化进ostr1中
cout << ostr1.str(); /*----------------------------------------------------------------------------
*** 建议:在用put()方法时,先查看当前put pointer的值,防止误写
----------------------------------------------------------------------------*/
long curPos = ostr2.tellp(); //返回当前插入的索引位置(即put pointer的值),从0开始
cout << "curPos = " << curPos << endl; ostr2.seekp(); // 手动设置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
最新文章
- javascript实用技巧、javascript高级技巧
- 浅谈DDOS攻击
- aspectj pointcut 找不到类型pointcut cannot be resolved to a type
- Live m3u8播放3个文件自动停止问题
- 174. Dungeon Game
- linux shell中的单引号与双引号的区别(看完就不会有引号的疑问了)(转)
- Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分
- KVM之十:虚拟机在线添加网卡
- Spring Boot + Vue 前后端分离,两种文件上传方式总结
- git 的常用命令(未完待补充)
- 2018-4-12 数学建模MATLAB常用的一些函数
- 单片机课程设计——课程设计之四位加法计算器(2)(C代码)
- 使用JMeter进行一次简单的带json数据的post请求测试,json可配置参数
- Grouping ZOJ - 3795 (tarjan缩点求最长路)
- JS中原始类型Null和Undefined
- vue - 状态管理器 Vuex
- 《Python黑帽子:黑客与渗透测试编程之道》 自动化攻击取证
- excel怎么在插入的方框上打勾
- spring答题
- django-allauth 使用