来自 C ++ Primer 5th (重点是我的):
只有一个标记库区分
seek
和tell
函数的“ putting”和“ getting”版本的事实可能会引起误解。即使库做出了这种区分,它在流中仅维护一个标记-没有明显的读取标记和写入标记。在处理仅输入流或仅输出流时,区别甚至不明显。在此类流上,我们只能使用
g
或p
版本。如果我们尝试在tellp
上调用ifstream
,则编译器会抱怨。同样,它不会让我们在seekg
上调用ostringstream
。
fstream
和stringstream
类型可以读取和写入相同的流。 在 这些类型有一个用于保存要读写数据的缓冲区和一个表示缓冲区中当前位置的标记。该库将g
和p
位置都映射到此位置单一标记。 因为只有一个标记,所以我们必须设法重新定位 每当我们在阅读和写作之间切换时就可以使用标记。
我对流缓冲区的所有了解都来自此页面https://en.cppreference.com/w/cpp/io/basic_streambuf。从文字和图表中,我知道流是包含数据的源,该数据最多可以具有 2 个缓冲区,由 6 指针维护。
那么实际上中引用的标记是什么?为什么说一个流只有一个标记同时允许输入和输出,这违反了我对流的基本理解?
答案 0 :(得分:0)
我不是专家,所以只是根据我自己的知识进行的有根据的猜测:
所谓的 marker 是流的当前偏移量,因此第一个字节是offset = 0
。
“放置”和“获取”之间的区别使用户可以实现自己的流类,该流类使用不同的g
和p
,因此不会在单个标记上进行读取/书写时,这种方法提供了更大的灵活性,因为您不必局限于单个标记。