C++之IO流

一、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>>()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值