【发布时间】:2018-09-19 00:42:56
【问题描述】:
来自C++ Primer 5th(强调我的):
只有一个标记库区分
seek和tell函数的“putting”和“getting”版本的事实可能会产生误导。尽管库做出了这种区分,它在流中只维护一个标记 - 没有不同的读取标记和写入标记。当我们处理仅输入或仅输出流时,区别甚至不明显。我们只能在此类流上使用
g或p版本。如果我们试图在ifstream上调用tellp,编译器会报错。同样,它不会让我们在ostringstream上调用seekg。
fstream和stringstream类型可以读取和写入相同的流。 在 这些类型有一个单独的缓冲区来保存要读取和写入的数据,以及一个表示缓冲区中当前位置的标记。 库将g和p位置映射到这个单个标记。 因为只有一个标记,我们必须重新定位 每当我们在阅读和写作之间切换时标记。
我对流缓冲区的所有了解都来自此页面https://en.cppreference.com/w/cpp/io/basic_streambuf。从文字和图表中,我知道流是包含数据的源,最多可以有 2 个缓冲区,由 6 个指针维护。
那么实际上引用中提到的标记是什么?为什么说一个流只有一个标记,既允许输入又允许输出,这违反了我对流的基本理解?
【问题讨论】: