我想对Nicolai Josuttis的书“The C ++ Standard Library”(第一版)第518页上的这一段做出一些解释:
这些标志由类
basic_ios
维护,因此存在于basic_istream
或basic_ostream
类型的所有对象中。但是,流缓冲区没有状态标志。一个流缓冲区可以由多个流对象共享,因此标志仅表示在上一个操作中找到的流的状态。即使只是在此操作之前设置了goodbit的情况下也是如此。否则,可能已经通过某些先前的操作设置了标志。
我不明白“流缓冲区没有状态标志”是什么意思,而在本段右下方有一个标题为“流状态的成员函数”的表。
答案 0 :(得分:2)
Streams由两个对象组成:
std::istream
或std::ostream
,派生自std::ios
)。std::streambuf
派生的类。状态标志位于std::ios
但不存在于std::streambuf
。
答案 1 :(得分:1)
有“流缓冲区对象”和“流对象”。可以在多个流对象之间共享一个流缓冲区。每个流对象都有自己的一组标志 - 因此一个流可能是“到达文件末尾”,而另一个不是 - 或者十进制或十六进制输出的标志对于使用相同缓冲区的两个输出流可能完全不同。
[当然,如果你对多个流使用相同的缓冲区,你必须注意不要搞砸了 - 并且在多个流上共享缓冲区并不常见,但它可以完成!]
答案 2 :(得分:1)
iostate
标志存储有关输出格式的内容:是否要以十进制或十六进制,大写或小写等方式打印数字。流对象控制格式,因此标志位于流对象内。
在iostreams中,缓冲与格式化是分开的。链接到iostream对象的是一个流缓冲对象,它控制从底层源发送和/或接收字符。缓冲区对象没有这样的标志;它唯一的状态变量涉及准备(编码)字符并可选地存储(缓冲)它们以减少操作系统被要求执行I / O的次数。 (或者在stringstream
的情况下,缓冲区提供流后面的最终存储。)
答案 3 :(得分:1)
所以流 有状态标志,但它使用的流缓冲区不。
流缓冲区进入流中。
缓冲区保存了一些字节,流在读/写之前将其发送/接收到流与之通信的任何内容(file / stdin / tcpsocket / etc.)。
流参考:http://www.cplusplus.com/reference/istream/iostream/
流缓冲区参考:http://www.cplusplus.com/reference/streambuf/streambuf/
默认情况下,流通常会创建自己的流缓冲区,但您可以告诉它使用您在构造函数中选择的一个:http://www.cplusplus.com/reference/istream/iostream/iostream/
或者您可以使用rdbuf方法获取/设置缓冲区。
答案 4 :(得分:0)
“流缓冲区”是类basic_streambuf的对象。该类没有状态标志。每个流(basic_istream或basic_ostream)都有一个指向basic_streambuf的指针,但这些标志是流的属性,而不是流缓冲区的属性。