【问题标题】:Does std::stringstream has two buffers and hence two markers?std::stringstream 是否有两个缓冲区,因此有两个标记?
【发布时间】:2021-02-21 21:24:43
【问题描述】:

关于 C++ 入门第 17 章; I/O 流;据说std::iostream 类型的对象或std::fstreamstd::stringstream 这样的派生类型同时支持读写。这些类型也只有一个 Marker 和一个 Buffer:

fstreamstringstream 类型可以读取和写入相同的流。在这些类型中,有一个缓冲区保存要读取和写入的数据,还有一个标记表示缓冲区中的当前位置。该库将gp 位置映射到这个单个标记。

为了了解更多,我完成了这个程序:

int main(){


    std::fstream fio("data.txt");
    std::cout << fio.tellg() << '\t' << fio.tellp() << '\n';
    fio.seekg(0, std::ios::end);
    std::cout << fio.tellg() << '\t' << fio.tellp() << '\n';

    std::stringstream ss("abcd\nefg\nhi\nj");
    std::cout << ss.tellg() << '\t' << ss.tellp() << '\n';
    ss.seekg(0, std::ios::end);
    std::cout << ss.tellg() << '\t' << ss.tellp() << '\n';

}

输出:

 0      0
 14     14
 0      0
 13     0 
  • 正如您在使用std::fstream 时看到的,如果我使用seekg() 移动读取标记,那么tellgtellp 返回相同的值。这太合乎逻辑了。

  • 但是,当移动 std::stringstreamtellgtellp 的读取标记时返回不同的值,所以写入标记没有被移动?

  • 这是否意味着std::stringstream 有两个缓冲区和两个标记?谢谢

【问题讨论】:

    标签: c++ fstream stringstream


    【解决方案1】:

    是的,书错了。

    同步读写位置的是std::basic_filebuf,并且,

    类模板basic_fstream在基于文件的流上实现高级输入/输出操作。它将基于文件的流缓冲区 (std::basic_filebuf) 与 (std::basic_iostream) 的高级接口相连接。

    然而,基类std::basic_streambuf 确实维护了单独的输入和输出缓冲区。请注意

    I/O 流对象 std::basic_istream 和 std::basic_ostream,以及从它们派生的所有对象(std::ofstream、std::stringstream 等)都已实现完全根据 std::basic_streambuf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2012-09-10
      • 2014-10-30
      相关资源
      最近更新 更多