一、IO流的关系图
这两个图很清楚的表示了各个类的继承关系,第二个图中的白框代表类,黑框代表对象,尖括号代表头文件。
二、IO对象不能复制或赋值
fstream fs1, fs2;
fs2 = fs1;
fstream fs3(fs2);
这种发生赋值运算符重载和拷贝构造的行为都是不允许的。因为在ios_base中拷贝构造和赋值运算符重载都是私有权限的:
//ios_base中的源码
private:
ios_base(const ios_base&);
ios_base&
operator=(const ios_base&);
三、IO对象存在缓冲
在对IO对象操作时,比如cin,通过键盘输入的数据并不立马赋给相应的变量当中,而是先放到输入缓冲区中,遇到回车符或其他结束符或者缓冲区满了才从缓冲区中取出数据赋给变量,对cout是一样的,并不是立马就把要输出的数据回馈到屏幕上,同样也是先放在输出缓冲区中,等到缓冲区满了,或者遇到刷新等操作才会把输出缓冲区的数据拿出来在屏幕上显示。
对于像这样的输出:
#include <iostream>
#include<fstream>
using namespace std;
int main()
{
cout << "kshfiuahuifhiusah";
while(1)
return 0;
}
是不会立马显示在屏幕上的,我在VS、QT和codeblock编译器都分别试了一下,由于现如今的编译器太强大,不是给优化了就是缓冲区太小,直接输出了。然后我在linux操作系统下重新试了一遍,木有问题,同样是上面那段代码,可以看到没有任何输入显示,这正是因为数据没有立马写在屏幕上,而是先放在缓冲区中了:
有几种方式会刷新缓冲,就可以把缓冲区中的数据拿出来到相应的IO设备上去:
1、程序结束时,也就是main函数结束时,会清空缓冲区;
2、当缓存区满时,会刷新缓冲;
3、endl和flush会刷新缓冲
4、unitbuf操作符会设置流的状态,清空缓冲
四、IO对象重载了<< 和 >>操作符
以前一直以为<< 和 >>就是专属于cin和cout的操作符,其实不然
cin >> 等价于 cin.operator>>()
cout << 等价于 cout.operator<<()
fstream fs;
fs << 等价于 fs.operator<<()
fs >> 等价于 fs.operator>>()