IO库

1 . IO类
  • 继承机制
    • 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制来实现的.比如:类型ifstream和istringstream都继承自istream.我们就可以像使用istream对象一样来使用ifstream和istringstream对象.
  • IO对象无拷贝或赋值
ofstream out1,out2;
out1 = out2;            //错误:不能对流对象赋值
ofstream print(ofstream);   //错误:不能初始化ofstream参数
out2 = print(out2);     //错误:不能拷贝流对象
 - 由于不能拷贝IO对象,因此我们也不能将形参或返回值类型设置为流类型.进行IO操作的函数通常以引用方式传递和返回流.读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的.
  • 管理输出缓冲
    • 导致缓冲刷新的原因:
      • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行.
      • 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区.
      • 我们可以使用操作符如endl来显式刷新缓冲区.
      • 在每个输出操作之后,我们可以用操纵符unitbuf设置流的内部状态,来清空缓冲区.默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的.
      • 一个输出流可能被关联到另一个流.在这种情况下,当读写被关联的流时,关联到流的缓冲区会被刷新.例如,默认情况下,cin和cerr都关联到cout.因此,读cin或写cerr都会导致cout的缓冲区被刷新.
cout << "hi!" << endl;      //输出hi和一个换行,然后刷新缓冲区
cout << "hi!" << flush;     //输出hi,然后刷新缓冲区,不附加任何额外字符
cout << "hi!" << ends;      //输出hi和一个空字符,然后刷新缓冲区
cout << unitbuf;    //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf;  //回到正常的缓冲方式

如果程序崩溃,输出缓冲区不会被刷新

  • 关联输入和输出流
    • 当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流. cin >> ival; 导致cout的缓冲区被刷新.
    • tie有两个版本:一个版本不带参数,返回指向输出流的指针.如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针.tie的第二个版本接受一个指向ostream的指针,将自己关联到此ostream.即,x.tie(&o)将流x关联到输出流o.
2 .文件输入输出
  • 文件模式
    • in 以读方式打开
    • out 以写方式打开
    • app 每次写操作前均定位到文件末尾
    • ate 打开文件后立即定位到文件末尾
    • trunc 截断文件
    • binary 以二进制方式进行IO
  • 指定文件模式有如下限制:
    • 只可以对ofstream或fstream对象设定out模式.
    • 只可以对ifstream或fstream对象设定in模式.
    • 只有当out也被设定时才可设定trunc模式.
    • 只要trunc没被设定,就可以设定app模式.在app模式下,即使没有显示指定out模式,文件也总是以输出方式被打开.
    • 默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截断.为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加到文件末尾;或者同时制定in模式,及打开文件同时进行读写操作.
    • ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用.

以out模式打开文件会丢弃已有数据,阻止一个ofstream清空给定文件内容的方法是同时指定app模式.

ofstream out;           //未指定文件打开模式
out.open("scratchpad"); //模式隐含设置为输出和截断
out.close();            //关闭out;以便我们将其用于其他文件
out.open("precious",ofstream::app); //模式为输出和追加
out.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值