文档介绍:chapter7-C++的IO流
LT
232
第八章 输入输出流(input/output stream)
的基本概念及原理
预定义数据类型的输入/输出
基本情况及其优点
C++输入输出流的优点:
(一)重载运算符“<<”和“>>”能以函数重载的形式极大地扩大用途,在输入输出流中充分体现多态性。
C语言的输入/输出系统本来就灵活性大、功能比较完善。但它有一个较大缺点:无法处理众多的用户自定义数据类型(主要是结构体、类及其对象)。例如,有一个结构体类型exampl如下:
struct exampl {
int j;
char str[80]; } str_ex;
如欲输出此结构体对象str_ex的两个成员的内容,因而笼统地使用如下输出语句printf,
printf(“%exampl”, str_ex);
则将会出现编译错误。而C++的输出/输入系统则能很好地解决这个问题。
(二)类型安全(type-safe)
[例1]C语言输出语句中的类型错误(第一章已看过)
#include <>
void main( )
{
int i=3;
double d=;
printf(“%d\t%f\n”, i, d);
233
}
运行结果:
3 对!
但如写错为:
printf(“%d\t%d\n”, i, d);
则编译时不出错,但运行结果错,为:
-26214
但在C++中只须写 cout<<i<<“ ”<<d<<endl;而不必写出变量类型!就能得出
3 ,对!
始终不会出错!
(三)通过缓存增加功能。
(四)附带优点是书写方便以及显示中没有冗余字符,能自动略去浮点数尾数中的零(但如用户希望显示多余的零,也可显示)。
C++的输入/输出系统是对流的操作,也即操作数据使其流向对象,或从对象流出。
什么是流?流是从源头到目的的数据流动。当键入字符时,字符从键盘流入程序中;当将数据写入磁盘文件中时,数据自程序流动至磁盘上。
C++输入/输出流库是使用继承方法建立起来的一个输入/输出类库,它具有两个平行的基类,即streambuf类和ios类。所有其它流类都是从它们直接或间接地派生出来的。
streambuf类用于提供物理设备的接口,它提供缓冲或处理流的通用方法。它作为一个虚基类,具有类层次如下:
streambuf
conbuf
filebuf
strstreambuf
234
图
ios类及其派生类用于为用户提供使用流类的接口。它使用streambuf完成检查错误的格式化输入/输出操作,并支持对streambuf的缓冲区进行输入/输出时的格式化或非格式化转换。
ios类作为流库中的一个虚基类,派生出许多派生类,其主要层次如下:
i o s
istream
fstreambase
ostream
fstream
istream-withassign
ostream-withassign
iostream
iostream-withassign
图
预定义流(标准流)的基本原理
预定义输出输入流涉及较多的头文件有四个:,,。下面分别介绍。
235
输出流的基本概念
输出流运算符“<<” ostream中定义的。,class ostream是从class ios中派生出来的。因此下面先看一下用于定义class 。
:
/***
* - definitions/declarations for the ios class.
***/
#ifndef NULL
#define NULL 0
#endif
#ifndef EOF
#define EOF (-1)
#endif
class ios {
public:
enum io_state { goodbit = 0x00,
eofbit = 0x01,