14.10 小结
本章详细地讨论了C++的文件存储机制,在介绍C++独有的流类库之前,讲述了从C语言继承而来的底层I/O和高层I/O机制。尤其是高层I/O机制的一些函数需要重点了解,这有助于读者读懂以前的代码,实现从高层I/O向C++流类库的转换。
从功能上讲,流类库可以分为输入流和输出流两部分。从操作的对象来看,可以分为标准输入输出流(面向控制台)、文件流(面向文件)和字符串流(面向字符串)。可以对流进行格式化,每个流也都维护着一个流状态,通过查询该状态可以知道操作是否成功以及其他相关信息。
98版标准中,所有的流类库都是确切定义的,而新标准的流类库都基于模板改写,以提供char和wchar_t两种实例化,通常所讲的iostream类实际上是basic_iostream模板类的char型实例。iostream头文件中自动定义并打开了8个流:cin、cerr、cout和clog,以及它们的wchar_t版本wcin、wcerr、wcout和wclog。
I/O类库提供了大量的成员方法,对所有的基本类型重载了<<(输出为字符或字符串)和>>(将字符或字符串转换为某类型)操作符,get函数和getline函数也可用于字符和字符串的输入,put函数和write函数也为字符和字符串的输出提供了支持。
使用ios_base类中提供的方法和头文件iomanip以及iostream中提供的控制符,可以对输入或输出的格式进行设置,同时,每个流维护着一个状态字,通过读取和设置状态字能判断流的好坏,进行合理控制。
fstrstream类族将iostream中的方法扩展到文件的处理上,fstream类族是从iostream类族继承而来的,所以,fstream类族对象可以调用所有的iostream方法来对文件进行操作。但和普通输入输出不同的是,必须将文件流对象和某文件关联起来,并按打开、读写和关闭的顺序进行操作。tellp函数、tellg函数、seekp函数和seekg函数用以对输入输出流指针进行操作,这使得文件和流的随机存取成为可能。
strstream类族和sstream类族可以使用istream和ostream类方法抽取字符串中的信息,并把要放在字符串中的信息格式化,strstream处理的是C风格字符串,而sstream类对象是针对C++风格字符串,也就是针对string类对象而言的。