1. 输入 / 输出流类层次 C++ 的输入 / 输出流类库是用派生方法建立起的,它有 2 个平行的基类, streambuf 和 ios 。其他的流类都是从这两个基类直接或间接派生的。 1.1 streambuf streambuf 类是带有缓冲区的流类库,它的作用是提供物理设备的接口、缓冲区或处理流的通用方式。当其用做流类库中的基类时,派生以下三个流类: (1) filebuf 类:使用文件来保存缓冲区中的字符序列; (2) strstreambuf 类:扩展 streambuf 的功能,提供在内存进行提取和插入操作的缓冲区管理; (3) onbuf 类:扩展类 streambuf 的功能,用于处理输出、提供控制光标、设置颜色、定义活动窗口、清屏、清一行等功能,为输出操作提供缓冲区管理; 该类使用的缓冲区由一个字符序列和输入缓冲区指针与输出缓冲区指针组成,指针指向字符被取出或插入的位置。通常情况下,均使用这三个派生类,很少直接使用 streambuf 类。 1.2 ios 类 ios 类及其派生类为用户提供了使用流类的接口,它们均有一个指针指向 streambuf 类。 Ios 及其派生类使用 streambuf 来完成对错误的格式化输入 \ 输出检查 , 并且支持对 streambuf 的缓冲区进行 I/O 时的格式化或非格式化转换。 ios 类及其派生类的层次关系: ios , istream,ostream 和上述提到的带缓冲区的流类库 streambuf 类构成了 C++ 中 iostream 输入 / 输出功能的基础。流是一个抽象的概念,实际进行 IO 操作时,必须将流与一种具体的物理设备联系起来。比如,将流和键盘联系起来,当从该流中提取数据时,就是从键盘输入数据,可以用 istream,ostream 等类声明流对象: istream is; ostream os; 2. 标准输入 / 输出流 C++ 将一些常用的流类对象,如键盘输入,显示器输出,程序运行出错输出,打印机输出等,定义并内置在系统中,供用户之间使用。这些系统内置的用于设备间传递数据的对象称为标准流类对象,共 4 个。 (1) cin 对象:与标准输入设备相关联的标准输入流; (2) cout 对象:与标准输出设备相关联的标准输出流; (3) cerr 对象:与标准错误输出设备相关联的非缓冲方式的标准输出流; (4) clog 对象:与标准错误输出设备相关联的缓冲方式的标准输出流。 例子 输出 char* 类型的变量 C 语言中的 I/O 必须要提供数据类型信息。 C++ 对此做了改进,能够自动判别数据类型,但是有时还得提供使用类型信息。比如,字符串是 char* 类型,假设需要输出其指针的值,即字符串中第一个字符的地址,但是重载运算符 输出的只是以空( null )字符串结尾的 char* 类型的字符串,因此使用 void* 类型来完成上述需求(需要输出指针变量的地址时都可以使用 void* 类型)。 #include iostream using namespace std; int main() { char *string = "test" ; cout "sting is: " string; cout "\n Value of static castvoid *(string) is: " ; cout static_cast void *(string) endl; system( "pause" ); return 0; } 通常在 while 循环结构的首部用流读取运算符输入一系列的值。当遇到文件结束符时,读取运算符返回( false )。 #include iostream using namespace std; int main() { int grade, highestGrade = -1; cout "Enter grade(enter end-of-file to end):" ; while (cin grade) { if (grade highestGrade) highestGrade = grade; cout "Enter grade (enter end of file to end):" ; } cout "\n Highest grade is:" highestGrade endl; system( "pause" ); return 0; } 在上述程序中, cingrade 可以作为条件,因为基类 ios( 继承 istream) 提供了一个重载的强制类型转换运算符,将流变成 void* 类型的指针。如果读取数值发生错误或遇到文件结束符,则指针值为 0 。编译器能够隐式使用 void* 类型的强制转换运算符。