`

C++中替代sprintf的std::ostringstream输出流详解

 
阅读更多
转自
http://blog.csdn.net/lanxuezaipiao/article/details/16358159


一、简单介绍
    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指向的内存已被析构!!

四、代码测试
<span style="font-size:18px;">#include <sstream>  
#include <string>  
#include <iostream> 
#include <sstream> 
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++String深入详解2.0版》PDF

    `std::string` 可以通过 C++ 的流机制进行输入和输出。 **1.7.1 C++ 流简介** C++ 流是一系列标准的输入/输出操作的封装,可以用于读写文本数据。 **1.7.2 `std::string` 与 `iostream`、`fstream`** `std::...

    33个c++重要知识总结(cpp代码)

    4. **串流之简单使用.cpp**:C++的I/O流库(iostream)允许我们使用`std::cout`输出和`std::cin`输入。`和`&gt;&gt;`操作符用于流的连接,`std::endl`用于换行。 5. **结构体中的运算符重载.cpp**:C++允许我们为自定义...

    基于C++中sprintf的错误总结详解

    在C++编程中,`sprintf`函数是一个非常实用的格式化输出函数,它与`printf`类似,但将输出写入到指定的字符数组而非标准输出流。然而,由于其变参数特性和对缓冲区大小的依赖,`sprintf`也常常成为错误的源头。以下...

    c++面试字符串_C++字符串_

    在C++编程语言中,字符串处理是至关重要的一个部分,特别是在面试中,考察候选人的字符串操作能力往往能反映出他们的编程技巧和经验。本篇将详细探讨C++面试中常见的字符串相关知识点,帮助你更好地准备面试。 一、...

    C++ string深入详解(最新版)

    ### C++ `string` 类深入详解 #### 一、C++ 的 `string` 使用 ##### 1.1 C++ `string` 简介 在 C++ 中,`string` 类是一个非常重要的类,它提供了丰富的接口来处理字符串。与 C 语言中的字符数组不同,`string` ...

    C++中sprintf()函数的使用详解

    C++中的`sprintf()`函数是一个非常实用的字符串格式化工具,它允许开发者将各种数据类型转换为字符串,其功能类似于`printf()`函数,但输出结果存储在字符数组(字符串)中而不是直接输出到标准输出。在本文中,我们...

    字符串和数字转换 C++ vs2008

    在C++中,字符串通常表示为`std::string`类型,而数字可以是整型(如`int`, `long long`等)、浮点型(如`float`, `double`)或其他数值类型。进行转换时,我们需要使用特定的函数或方法。 **字符串转数字** 1. **...

    zifuchuan.zip_C++Builder数据

    `sprintf`函数是C语言中的格式化输出函数,也可以在C++中使用。我们可以利用它来生成十六进制字符串: ```cpp #include std::string to_hex(char data) { char hexBuffer[3] = {0}; sprintf(hexBuffer, "%02X...

    字符串和数字的转换(c/c++多种实现方式)

    `sprintf`函数可以将格式化输出写入到字符串中。该函数的原型为`int sprintf(char *str, const char *format, ...);`。 ```cpp #include #include void writeIntoStr(std::string& str, int num) { sprintf...

    深入学习C++_String

    C++流是一种输入输出机制,`std::string`可以直接与流对象交互。 **1.7.2 string与iostream、fstream** `std::string`可以与`std::istream`和`std::ostream`以及文件流`std::fstream`交互。 **1.8 格式化字符串**...

    format:C++ 的花括号字符串格式

    C++ 的花括号字符串格式,如 Python 和 C#。 尚不处理浮点格式说明符或隐式参数索引,但可以正确处理转义大括号"{{" 。 // char buf[32]; // sprintf(buf, "(%d, %f, %f)", vec.x, vec.y, vec.z); // spot the ...

    C++文件按序列号读取、读取文件大小、计时

    在C++编程中,处理文件是一项常见的任务,包括读取文件内容、获取文件大小以及对文件操作进行计时。在给定的标题和描述中,我们聚焦于几个关键点:按序列号读取文件、计算文件大小、计时以及安全地使用`fopen_s`函数...

    C++中几种将整数转换成二进制输出的方法总结

    在C++编程语言中,将整数转换为二进制并输出是一个常见的需求,特别是在处理位操作、数据存储或算法实现时。本文将总结几种不同的方法来实现这一目标。 首先,我们可以使用递归的方式来输出整数的二进制表示。如`...

    C++中数字与字符串之间的转换.docx

    在C++编程中,数字与字符串之间的转换是常见的操作,特别是在处理用户输入、显示输出或者进行数据存储时。本文将详细讲解C++中数字与字符串转换的方法。 首先,我们来看字符串转换为数字的过程: 1. **`char *` ...

    C++中数字与字符串之间的转换.pdf

    - `string`到`char*`:C++中的`std::string`对象可以通过`c_str()`方法转换为`const char*`指针,如`char * p = str.c_str();` - `char*`到`string`:可以直接用`char*`初始化`std::string`对象,如`string str(p)...

    c++builder 10.3下获取mac地址的代码

    以下是一个关于如何在C++Builder 10.3及更高版本中实现此功能的知识点详解: 1. **Windows API调用**: 在Windows操作系统中,可以使用Windows API函数来获取MAC地址。主要涉及到`iphlpapi.lib`库中的函数,如`...

    字串格式化命令Sprintf详细介绍

    在实际应用中,sprintf 函数经常用于输出格式化的数据,例如,输出一个浮点数,可以使用 sprintf("%f", 3.14);输出一个字符串,可以使用 sprintf("%s", "hello");等等。 sprintf 函数的使用需要注意一些常见的...

    C/C++头文件一览

    ### C/C++头文件概述与知识点详解 #### 1. `&lt;assert.h&gt;` — 断言与调试工具 - **用途**:提供断言宏`assert`用于程序开发过程中的调试,帮助开发者验证程序运行时的状态是否符合预期。 - **示例**: ```c++ #...

Global site tag (gtag.js) - Google Analytics