C++中std::ostringstream输出用法

本文介绍了C++中ostringstream类的使用方法,包括构造函数、基本操作如str()和put()等,并给出了注意事项及示例代码。对于需要格式化字符串但不确定所需缓冲区大小的情况,ostringstream是一个很好的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++中std::ostringstream输出用法

一、简单介绍

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

派生关系图:
这里写图片描述

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

四、代码测试

复制代码

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

运行结果如下:
这里写图片描述

转自:http://blog.youkuaiyun.com/lanxuezaipiao/article/details/16358159

### std::ostringstream 的基本概念 `std::ostringstream` 是 C++ 标准库中的一个类模板,属于 `<sstream>` 头文件的一部分。它提供了一种方便的方式来构建动态字符串输出流。通过 `std::ostringstream`,可以像操作标准输出流 (`std::cout`) 一样向其写入数据,并最终将其转换为字符串。 以下是关于 `std::ostringstream` 的主要功能及其用法: #### 创建和初始化 可以通过默认构造函数创建一个 `std::ostringstream` 对象[^2]。例如: ```cpp #include <sstream> std::ostringstream oss; ``` #### 向流中写入数据 类似于使用 `operator<<` 将数据写入到 `std::cout` 中的方式,也可以将各种类型的变量写入到 `std::ostringstream` 流中[^1]。例如: ```cpp oss << "The value of pi is: " << 3.14159 << "\n"; ``` #### 获取流的内容 调用成员函数 `.str()` 可以获取当前存储在流中的字符串内容[^4]。例如: ```cpp std::string result = oss.str(); ``` #### 清空流并重新开始 如果需要清空流以便再次写入新内容,则可以先调用 `.str("")` 方法来清除现有内容。例如: ```cpp oss.str(""); oss.clear(); // 还原流的状态标志位 ``` --- ### 完整示例代码 下面是一个完整的例子,展示了如何利用 `std::ostringstream` 实现格式化的字符串拼接以及数值精度控制等功能: ```cpp #include <iostream> #include <iomanip> // 提供 setprecision 和 fixed 支持 #include <sstream> // ostringstream 所需头文件 using namespace std; int main() { double pi = 3.141592653589793; // 创建 ostringstream 对象 ostringstream oss; // 设置浮点数显示模式为固定小数形式,并指定保留两位小数 oss << fixed << setprecision(2); // 插入数据至流中 oss << "Value of Pi with precision control: " << pi; // 转换流内容为 string 类型 string result = oss.str(); cout << result << endl; // 输出:Value of Pi with precision control: 3.14 return 0; } ``` 上述程序演示了如何设置固定的浮点表示方式、调整小数位数,并将结果保存在一个可读取的字符串变量中。 --- ### 关于底层机制 当实例化了一个 `std::ostringstream` 对象时,默认情况下会关联一个内部缓冲区(由 `std::basic_stringbuf` 维护),该缓冲区可通过 `rdbuf()` 函数访问[^3]。这意味着你可以手动操控这个缓冲区来进行更复杂的输入/输出处理。 例如,假设你想把某些特定的数据直接发送给另一个基于字符流的对象而不是简单地提取成字符串,那么可以直接传递此缓冲区作为目标位置之一。 --- ### 总结 综上所述,在实际开发过程中遇到需要频繁生成复杂格式文本的需求时,采用 `std::ostringstream` 不仅能够简化逻辑还能提高代码可维护性和效率。同时由于支持链式调用特性使得表达更加直观易懂。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值