一、简单介绍
ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostringstream类通常用于执行C风格的串流的输出操作,格式化字符串,避免申请大量的缓冲区,替代sprintf。
派生关系图:
二、ostringstream的基本使用
有时候,我们需要格式化一个字符串,但通常并不知道需要多大的缓冲区。为了保险常常申请大量的缓冲区以防止缓冲区过小造成字符串无法全部存储。这时我们可以考虑使用ostringstream类,该类能够根据内容自动分配内存,并且其对内存的管理也是相当的到位。取得std::ostringstream里的内容可以通过str()和str(string&)成员函数。
三、注意事项
std::ostringstream::str()返回的是临时对象,不能对其直接操作。
例如会有如下误用:
constchar* pBuffer = oss.str().c_str();
注意pBuffer指向的内存已被析构!!
四、代码测试
#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;
}
运行结果如下:
分享到:
相关推荐
本篇文章是对C++中sprintf()函数的使用进行了详细的分析介绍,需要的朋友参考下
C++ 的花括号字符串格式,如 Python 和 C#。 尚不处理浮点格式说明符或隐式参数索引,但可以正确处理转义大括号"{{" 。 // char buf[32]; // sprintf(buf, "(%d, %f, %f)", vec.x, vec.y, vec.z); // spot the ...
本篇文章是对C++中sprintf的错误进行了详细的分析介绍,需要的朋友参考下
不错的资源,可以帮助提高对C++ 函数sprintf的格式有一定的了解。
如果你像我一样,你会在 matlab 编码中广泛使用 sprintf。 当你学习 python 时,你开始嫉妒 python (%) 中漂亮的内置 printf 插值运算符。 通过重载元胞数组 \ 运算符,这在 matlab 中实现了相同的效果。 老的: >...
aa += sprintf(aa, "%d ", a); } out.assign(buff); } }; void main() { TemplateThunk athunk; Test tt; tt.mm = { 1, 3, 7, 8, 5, 6, 4, 2, 3, 10 }; tt.Entry(athunk.GetCall(&CallBack;::DebugArray,&...
string-sprintf:String :: Sprintf Perl模块
用sprintf把整数打印到字符串中,控制浮点数打印格式,连接字符串,以及sprintf返回值的使用。
sprintf: "^5.0.0" 然后运行pub install 。 接下来,导入dart-sprintf: import 'package:sprintf/sprintf.dart'; 例子 import 'package:sprintf/sprintf.dart'; void main() { print(sprintf("i", [-42])); ...
本文对嵌入式开发领域中常用的sprintf函数进行了详细的介绍,刚入此行不甚了解的同学可以下载来看看学习一下
sprintf(pcOut,"{\"base64\":\"%s\",\"filename\":\"%s\"}",*p.get(),"D:\\\\job\\\\greatwall\\\\test\\\\out.jpg"); //const char* ret = _64tofile(pcOut); std::unique_ptr*>ret(new const char*(_64...
matlab导入excel代码VBA_sprintf 在VBA中实现的C / C ++ / Matlab函数sprintf 动机 是否曾经想过在Excel VBA中格式化数字? 令人眼花。乱。 假设您要打印两个浮点数,其文本宽度为6,精度为2。 这是您可以在VBA中...
主要介绍了C++中sprintf使用的方法与printf的区别,实例分析了sprintf与printf的具体用法及相关注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
sprintf的用法详解[文].pdf
C语言sprintf函数详解:在将各种类 型的数据构造成字符串时,sprintf的强大功能很少会让你失望。
详细的关于sprinf的资料,看后能更好的使用sprintf。
ADS 的sprintf()输出浮点问题