跳转到内容

C++/sstream

维基教科书,自由的教学读本
< C++

sstream头文件主要定义了基于std::string类的流输入输出。

注意,strstream头文件及其定义的std::strstream被C++11宣布为过时,被C++17正式废除(不再支持)。std::strstream使用一个字符数组初始化时,就以该数组为工作区。相反,std::stringstream使用一个字符数组初始化时,会申请分配自己的工作区(std::string)并把初始化数组“深拷贝”到工作区。废除std::strstream的理由:

  1. . std::strstream返回一个很难管理的 char *,因为没有说明它是如何分配的。因此,不可能知道是否应该释放它所占的内存或对其调用 free() 或对它做任何其他事情。释放它的唯一真正令人满意的方法是通过 freeze() 函数将其交还给 strstream。 这一点不够明显,以至于很多人都弄错了。 std::stringstream 返回一个自我管理的字符串对象,这更不容易出错。
  2. 必须使用std::ends来终止字符串。

类模板

[编辑]
  • basic_stringbuf: 继承自basic_streambuf
    • str : 获取、设置字符串缓冲区的内容。获取时返回的是一个临时对象。
    • operator =(移动语义) : 移动语义的赋值运算符。
    • swap : 交换两个对象内容。
    • rdbuf : 返回内部的basic_stringbuf对象指针。
  • basic_istringstream
  • basic_ostringstream
    • 构造函数:如果带一个std::string参数,则使用参数的内容作为被构造的对象的初始内容。
  • basic_stringstream

类型

[编辑]
  • istringstream
  • ostringstream
  • stringstream
  • stringbuf
  • wistringstream
  • wostringstream
  • wstringstream
  • wstringbuf


函数

[编辑]

类型定义

[编辑]
  • typedef basic_istringstream< char > istringstream;
  • typedef basic_ostringstream< char > ostringstream;
  • typedef basic_stringstream< char > stringstream;
  • typedef basic_stringbuf< char > stringbuf;
  • typedef basic_istringstream< wchar_t > wistringstream;
  • typedef basic_ostringstream< wchar_t > wostringstream;
  • typedef basic_stringstream< wchar_t > wstringstream;
  • typedef basic_stringbuf< wchar_t > wstringbuf;

实践

[编辑]

重复使用同一个ostringstream对象时,建议:

  • 调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit); 标志位一共有4种, goodbit, eofbit, failbit, badbit, clear()可以清除掉所有的error state
  • 调用str("")将缓冲区清零,清除脏数据