#include <iostream.h> class stream_MT ; class streambuf : public stream_MT ; class unsafe_ios ; class ios : virtual public unsafe_ios, public stream_MT ; class unsafe_istream : virtual public unsafe_ios ; class istream : virtual public ios, public unsafe_istream ; class unsafe_ostream : virtual public unsafe_ios ; class ostream : virtual public ios, public unsafe_ostream ; class unsafe_iostream : public unsafe_istream, public unsafe_ostream ; class iostream : public istream, public ostream ; class istream_withassign : public istream ; class ostream_withassign : public ostream ; class iostream_withassign : public iostream ;
class Iostream_init ;
extern istream_withassign cin ; extern ostream_withassign cout ; extern ostream_withassign cerr ; extern ostream_withassign clog ;
#include <fstream.h> class filebuf : public streambuf ; class unsafe_fstreambase : virtual public unsafe_ios ; class fstreambase : virtual public ios, public unsafe_fstreambase ; class fstream : public fstreambase, public iostream ; class ifstream : public fstreambase, public istream ; class ofstream : public fstreambase, public ostream ;
#include <strstream.h> class strstreambuf : public streambuf ; class unsafe_strstreambase : public virtual unsafe_ios ; class strstreambase : public virtual ios, public unsafe_strstreambase ; class istrstream : public strstreambase, public istream ; class ostrstream : public strstreambase, public ostream ; class strstream : public strstreambase, public iostream ;
#include <stdiostream.h> class stdiobuf : public streambuf ; class stdiostream : public ios ;
这些手册页提供了理解构成 C++ 流 I/O 的各个函数和类的详细信息所需的参考资料。此处使用的术语“流”与 C 语言中的 stdio 文件(也称为流)或 Unix System V 流没有任何关系。
iostream 软件包已扩展,支持在 libthread 库下的多个协作线程之间共享 iostream 对象。大多数 iostream 类现在都是以两种形式定义的:一种是“非安全”版本,此版本未针对多个线程的同时访问提供保护;另一种为“安全”版本,此版本使用互斥锁针对并发访问提供保护。类 streambuf 和类 filebuf 是两个例外;这些对象同时支持所有相关成员函数的有锁和无锁版本。无锁版本由后缀 _unlocked 予以区分,该后缀附加在函数名称末尾。
使用“安全”版本不担保应用程序在多线程环境中将正确运行;有关此主题的更多信息,请参见《C++ Library Reference》中的第 4 章 "Using Classic iostream in a Multithreaded Environment"。
Bjarne Stroustrup 发明的 C++ 编程语言的原始版本引入了 C++ 流 I/O,这是在 C++ 编译器的早期发行版中出现的。从 C++ 的 "2.0" 发行版开始,出现了流 I/O 的一个新版本,通常称为 iostreams。与原始流 I/O 相比,iostreams 能够更有效地利用 C++ 语言的功能,尤其是 C++ 的早期版本中没有的新语言功能。基本的流 I/O 在两种流版本中仍然以相同的方式工作,并且 iostreams 包括了一些向后兼容性功能以进一步方便过渡。由于额外的语言更改,iostreams 的此最新发行版具有进一步的修改。更改分为两类:char 类型中的更改和针对嵌套类型的规则的更改。
虽然 C++ 的早期实现只有两种字符类型,但是 C++ 现在具有三个不同版本的 char 类型:“纯”char、有符号 char 和无符号 char。iostreams 的早期版本具有接受“纯”char(有符号)的函数版本和接受无符号 char 的其他版本。因为这些函数(大多数)仅处理字符和字符数组,因此现在这类函数(大多数)只有一个版本并且接受“纯”char。
C++ 的早期版本使用以下 C 规则:对于在类内部定义的类型,其处理方式与在类外部定义的类型一样。该 C++ 语言规则现在如下所述:在类内部定义的任何类型是该类本地的,并且只能通过外部的类限定符进行引用。这只影响某些位置的 iostreams。例如,在类 ios 内部定义的枚举类型名称现在必须是限定的。也就是说,不能使用 io_state 或 seek_dir,现在应当使用 ios::io_state 或 ios::seek_dir。
在这些手册页中,我们描述了使用 iostreams 编写可移植的程序所需的公共接口和受保护接口。我们不讨论没有向公众公布的实现细节以及在可移植程序中不应当依赖的实现细节。
Iostreams 从根本上来说是类分层结构的集合。基础类如下所述:
此类包含各种流类通用的状态变量,例如错误状态和格式设置状态。此类未针对多线程访问提供保护。请参见 ios (3CC4) 。
类 ios 是所有流的一个虚拟基类。它维护着格式设置和状态信息。 ios (3CC4) 中进一步描述了此类。此类使用互斥锁针对多线程访问提供保护。请参见 ios (3CC4) 。
类 streambuf 是所有流缓冲区的虚拟基类。此类定义了用于对插入(存储,也称为放置)和提取(拾取,也称为获取)进行缓冲和支持的基本功能。每个非虚拟成员函数都是以两种版本定义的:一种为“无锁”版本(由附加到函数名称末尾的后缀 _unlocked 予以区分),此版本未针对多线程访问提供保护;另一种为“有锁”版本,此版本(缺省版本)是多线程安全的。sbufpub(3CC4) 中描述了类的公共接口(用于编程 I/O)。sbufprot(3CC4) 中描述了类的受保护接口(在派生新的缓冲区类时使用)。
此类支持对通过 streambuf 获取的字符序列进行有格式的和无格式的转换。此类未针对多线程访问提供保护。请参见 istream (3CC4) 。
类 istream 在关联的 streambuf 上提供有格式的和无格式的输入操作。istream(3CC4) 中进一步描述了此类。
此类支持对存储到 streambuf 中的字符序列进行有格式的和无格式的转换。此类未针对多线程访问提供保护。请参见 ostream (3CC4) 。
类 ostream 在关联的 streambuf 上提供有格式的和无格式的输出操作。ostream(3CC4) 中进一步描述了此类。
类 iostream 组合了 istream 和 ostream 的功能。iostream 在单个双向流上同时提供输入和输出。
类 istream_withassign、ostream_withassign 和 iostream_withassign 向其对应的类 istream、ostream 和 iostream 添加赋值运算符。由于技术原因,预定义的流 cin、cout、cerr 和 clog(在下文中描述)需要赋值运算符,这些类类型的对象也需要赋值运算符。
与流关联的缓冲区类定义了获取或存储字符的方式。您可以从 streambuf 派生您自己的缓冲区类,如 sbufprot(3CC4) 中所述。随 iostreams 提供了三个预定义的缓冲区类:
此缓冲区类通过低级别文件描述符提供文件 I/O;filebuf 不使用 C 语言“标准 I/O”(stdio)。成员函数支持文件打开、关闭和查找操作。当从 filebuf 获取或者向其进行输入时,缓冲区类根据需要读取或写入关联的文件。每个非虚拟成员函数都是以两种版本定义的:一种为“无锁”版本(由附加到函数名称末尾的后缀 _unlocked 予以区分),此版本未针对多线程访问提供保护;另一种为“有锁”版本,此版本(缺省版本)是多线程安全的。filebuf(3CC4) 中进一步描述了此类。
此缓冲区类使用 C stdio FILE 结构提供 I/O。这种形式的 I/O 的效率比使用 filesbuf 低得多。如果您必须使用 iostream 和 C stdio 以混合方式向同一文件执行 I/O,请使用 stdiobuf 作为流缓冲区类。否则,请使用 filebuf。stdiobuf(3CC4) 中进一步描述了此类。
此类在流与字符数组之间提供有格式的和无格式的内存转换。每个非虚拟成员函数都是以两种版本定义的:一种为“无锁”版本(由附加到函数名称末尾的后缀 _unlocked 予以区分),此版本未针对多线程访问提供保护;另一种为“有锁”版本,此版本(缺省版本)是多线程安全的。ssbuf(3CC4) 中进一步描述了此类。
您通常通过从 istream、ostream 和 iostream 之一进行派生并使用专门的缓冲区类来定义流类。提供了多个预定义的流类来满足最常见的需求:
这些类通过使用 filebuf 作为关联的缓冲区类支持文件 I/O。它们分别用于输入、输出和双向用途。这些类通过互斥锁针对多线程访问提供保护。fstream(3CC4) 中进一步描述了这些类。
这些类通过使用 strstreambuf 作为关联的缓冲区类使用内存中字符数组支持 "I/O"。它们分别用于输入、输出和双向用途。这些类通过互斥锁针对多线程访问提供保护。 strstream (3CC4) 中进一步描述了这些类。
此类使用 stdiobuf 作为其关联的缓冲区类。如上所述,这比使用 fstream 或使用 filebuf 的其他流要低效得多。使用 stdiostream 的唯一原因是能够同时从 iostreams 代码和 C stdio 代码向同一文件执行 I/O。stdiobuf(3CC4) 中进一步描述了此类。
C 和 C++ 程序传统上使用用于 I/O 的三个预定义文件开始执行:标准输入、输出和错误文件。当在您的程序中包括了 <iostream.h> 时,将有四个预定义的 iostream 可供使用:
连接到标准输入(文件描述符 0)。
连接到标准输出(文件描述符 1)。
连接到标准错误(文件描述符 2)。写入到 cerr 的数据缺省情况下是单元缓冲的,这意味着每次完成插入操作后都对字符进行刷新。
连接到标准错误(文件描述符 2)。缺省情况下,此流是完全缓冲的,这是与使用 cerr 时的唯一区别。
流 cin、cerr 和 clog 绑定到 cout,这意味着在从 cin 中提取或者插入到 cerr 或 clog 中之前会对 cout 进行刷新。缺省情况下,预定义的流使用互斥锁针对多线程访问提供保护。可以通过调用类 stream_MT 定义的成员函数 set_safe_flag 禁用此保护。
此头文件提供了 iostreams 的基本功能,包括预定义的流的使用。
此头文件包括了 <iostream.h> 并且还定义了 filebuf 和 fstream 类。
此头文件包括了 <iostream.h> 并且还定义了 strstreambuf 和 strstream 类。
此头文件包括了 <iostream.h> 并且还定义了 stdiobuf 和 stdiostream 类。
此头文件定义了一些标准操纵符。本教程以及 manip(3CC4) 中描述了操纵符。
filebuf(3CC4)、fstream(3CC4)、ios(3CC4)、istream(3CC4)、manip(3CC4)、ostream(3CC4)、sbufprot(3CC4)、sbufpub(3CC4)、ssbuf(3CC4)、stdiobuf(3CC4)、strstream(3CC4)、stream_locker(3CC4)、stream_MT(3CC4)
《C++ Library Reference》中的第 3 章 "The Classic iostream Library" 和第 4 章 "Using Classic iostreams in a Multithreaded Environment"。