2

我想对 Nicolai Josuttis 书“C++ 标准库”(第一版)第 518 页上的这一段有一些解释:

这些标志由类维护,basic_ios因此存在于所有类型为basic_istreamor的对象中basic_ostream。但是,流缓冲区没有状态标志。一个流缓冲区可以由多个流对象共享,因此标志仅表示在最后一个操作中找到的流的状态。即使只有在此操作之前设置好位时才会出现这种情况。否则,标志可能已由一些较早的操作设置。

我不明白他所说的“流缓冲区没有状态标志”是什么意思,并且在本段下方有一个标题为“流状态的成员函数”的表格。

4

5 回答 5

2

流由两个对象组成:

  1. 实际的流对象(std::istreamstd::ostream,派生自std::ios)。
  2. 流缓冲区,即从std::streambuf.

状态标志存在于std::ios但不存在于std::streambuf.

于 2013-01-06T00:10:46.430 回答
1

有“流缓冲区对象”和“流对象”。一个流缓冲区可以在多个流对象之间共享。每个流对象都有自己的一组标志 - 因此一个流可能“到达文件末尾”,而另一个流没有 - 或者对于使用相同缓冲区的两个输出流,十进制或十六进制输出的标志可能完全不同。

[当然,如果您对多个流使用相同的缓冲区,则必须注意不要把事情搞砸——在多个流上共享缓冲区并不常见,但可以做到! ]

于 2013-01-06T00:10:22.633 回答
1

标志存储有关输出格式的iostate内容:您是否希望以十进制或十六进制打印数字,大写或小写等。流对象控制格式,因此标志位于流对象内部。

在 iostreams 中,缓冲与格式化是分开的。链接到 iostream 对象的是一个流缓冲区对象,它控制从底层源发送和/或接收字符。缓冲区对象没有这样的标志;它唯一的状态变量处理准备(编码)字符并可选地存储(缓冲)它们以减少操作系统被要求执行 I/O 的次数。(或者在 的情况下stringstream,缓冲区提供流后面的最终存储。)

于 2013-01-06T00:10:27.923 回答
1

所以一个 有状态标志,但它使用的流缓冲区没有

流缓冲区进入流内部。

缓冲区保存流正在读取/写入的一些字节数,然后再将其发送/接收到流正在与之交谈的任何内容(文件/stdin/tcpsocket/等)。

流参考:http ://www.cplusplus.com/reference/istream/iostream/

流缓冲区参考:http ://www.cplusplus.com/reference/streambuf/streambuf/

默认情况下,流通常会创建自己的流缓冲区,但您可以告诉它使用您在构造函数中选择的一个:http ://www.cplusplus.com/reference/istream/iostream/iostream/

或者您可以使用rdbuf方法获取/设置缓冲区。

于 2013-01-06T00:15:12.147 回答
0

“流缓冲区”是类 basic_streambuf 的对象。那个班级没有州旗。每个流(basic_istream 或 basic_ostream)都有一个指向 basic_streambuf 的指针,但标志是流的属性,而不是流缓冲区的属性。

于 2013-01-06T00:13:47.587 回答