博客
关于我
c++中istringstream及ostringstream超详细说明
阅读量:382 次
发布时间:2019-03-05

本文共 3463 字,大约阅读时间需要 11 分钟。

以及
类在C++程序中扮演着重要的角色。这些类不仅提供了灵活的字符串缓冲区,还为开发者提供了方便的数据流操作接口。本文将从stringbuf开始,逐步介绍这些类的特点和使用方法。

1. stringbuf类介绍

stringbuf类的核心作用是实现一个基于std::string的缓冲区。它采用双端队列的方式来管理内存,能够根据需要动态地扩展或收缩缓冲空间。stringbuf的内置缓冲区使用std::string作为存储介质,通过构造时的读写模式来决定缓冲区的使用方式。

1.1 stringbuf的构造函数

stringbuf类提供了两个主要的构造函数:

  • 默认构造函数
  • explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out) 
    : __streambuf_type(), _M_mode(__mode), _M_stringbuf() {
    _M_stringbuf_init(__mode);
    }
    1. 带有初始内容的构造函数
    2. explicit basic_stringbuf(const string_type& __str, 
      ios_base::openmode __mode = ios_base::in | ios_base::out)
      : __streambuf_type(), _M_mode(), _M_stringbuf(__str.data(), __str.size()) {
      _M_stringbuf_init(__mode);
      }

      使用示例

      #include 
      using namespace std;
      int main() {
      stringbuf* buf = new stringbuf(ios_base::in); // 可读缓冲区
      string str("缓冲区内容");
      stringbuf* bufStr = new stringbuf(str, ios_base::out); // 可写缓冲区
      // 使用前需确保动态内存释放
      if (buf != nullptr) {
      delete buf;
      }
      if (bufStr != nullptr) {
      delete bufStr;
      }
      return 0;
      }

      1.2 str函数

      str函数用于获取当前缓冲区中的字符串内容:

      string_type str() const;  // 获取当前缓冲区内容
      void str(const string_type& __s); // 将字符串赋值给缓冲区

      使用示例

      #include 
      using namespace std;
      int main() {
      stringbuf* buf = new stringbuf(ios_base::in);
      string str("初始内容");
      stringbuf* bufStr = new stringbuf(str, ios_base::out);
      cout << bufStr->str() << endl; // 输出写入缓冲区后的内容
      buf->str(string("修改后的内容")); // 修改缓冲区内容
      cout << buf->str() << endl; // 输出最新内容
      // 释放动态内存
      if (buf != nullptr) {
      delete buf;
      }
      if (bufStr != nullptr) {
      delete bufStr;
      }
      return 0;
      }

      2. istringstream类

      istringstream是basic_istringstream的一个char类型实例,默认以读取模式打开。它继承自basic_istringstream,提供了与stringbuf兼容的接口。istringstream的构造函数与stringbuf类似,但默认模式为ios_base::in

      2.1 rdbuf函数

      rdbuf函数用于获取当前缓冲区的stringbuf指针:

      stringbuf_type* rdbuf() const;

      使用示例

      #include 
      using namespace std;
      int main() {
      istringstream istr("输入流内容");
      string str = istr.str(); // 获取字符串内容
      // 检查缓冲区可用长度
      cout << "缓冲区长度: " << istr.rdbuf()->in_avail() << endl;
      return 0;
      }

      2.2 swap函数

      swap函数用于交换两个istringstream对象的内容:

      void swap(basic_istringstream& __rhs);

      使用示例

      #include 
      using namespace std;
      int main() {
      string s1 = "字符串1";
      string s2 = "字符串2";
      istringstream istr1(s1);
      istringstream istr2(s2);
      // 交换内容
      istr1.swap(istr2);
      cout << "交换后 istr1: " << istr1.str() << endl;
      cout << "交换后 istr2: " << istr2.str() << endl;
      return 0;
      }

      3. ostringstream类和stringstream类

      ostringstream用于将数据写入字符串,默认模式为ios_base::out。它类似于basic_ostringstream,提供了与istringstream一致的接口。

      3.1 stringstream类

      stringstream类继承自iostream,支持同时读取和写入数据。它的构造函数默认模式为ios_base::out | ios_base::in,允许双向操作。

      构造函数示例

      explicit basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
      : __iostream_type(), _M_stringbuf(__m) {
      this->init(&_M_stringbuf);
      }

      使用示例

      #include 
      using namespace std;
      int main() {
      stringbuf* buf = new stringbuf(ios_base::in);
      ostringstream oss;
      stringbuf* ossBuf = oss.rdbuf();
      // 写入数据
      oss << "输出到字符串: ";
      oss << static_cast
      (buf->str());
      // 读取数据
      string str = oss.str();
      cout << "读取结果: " << str << endl;
      // 释放资源
      if (buf != nullptr) {
      delete buf;
      }
      if (ossBuf != nullptr) {
      delete ossBuf;
      }
      return 0;
      }

      通过以上内容,可以看出

      类在C++程序中的重要性。理解这些类的特点和使用方法,是掌握C++ IO库的关键所在。

    转载地址:http://jccwz.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>