【问题标题】:What is a marker of a stream and why there's only 1 marker in a stream?什么是流的标记,为什么流中只有 1 个标记?
【发布时间】:2018-09-19 00:42:56
【问题描述】:

来自C++ Primer 5th(强调我的):

只有一个标记

库区分seektell 函数的“putting”和“getting”版本的事实可能会产生误导。尽管库做出了这种区分,它在流中只维护一个标记 - 没有不同的读取标记和写入标记

当我们处理仅输入或仅输出流时,区别甚至不明显。我们只能在此类流上使用gp 版本。如果我们试图在ifstream 上调用tellp,编译器会报错。同样,它不会让我们在ostringstream 上调用seekg

fstreamstringstream 类型可以读取和写入相同的流。 在 这些类型有一个单独的缓冲区来保存要读取和写入的数据,以及一个表示缓冲区中当前位置的标记。 库将gp 位置映射到这个单个标记。 因为只有一个标记,我们必须重新定位 每当我们在阅读和写作之间切换时标记。


我对流缓冲区的所有了解都来自此页面https://en.cppreference.com/w/cpp/io/basic_streambuf。从文字和图表中,我知道流是包含数据的源,最多可以有 2 个缓冲区,由 6 个指针维护。

那么实际上引用中提到的标记是什么?为什么说一个流只有一个标记,既允许输入又允许输出,这违反了我对流的基本理解?

【问题讨论】:

    标签: c++ stream


    【解决方案1】:

    我不是专家,所以只是根据我自己的知识进行有根据的猜测:

    1. 所谓的marker是当前距离流开头的offset,所以第一个字节是offset = 0

    2. “putting”和“getting”之间的区别允许用户实现自己的流类,这些流类使用不同的gp,因此不会中继在单个标记上进行读/写,这种方法提供更大的灵活性,因为您不会被绑定到单个标记。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2016-12-29
      • 2013-04-24
      • 2012-05-04
      • 2021-04-23
      相关资源
      最近更新 更多