IO类

几种IO类型:

iostream:从流(读或写)数据  , fstream:从文件(读或写)数据 ,sstream:从string中(读或写)数据,某个流类型前面有'w'表示宽字符的版本。

 

IO类型之间的关系:

设备类型和字符大小都不会影响执行的IO操作,这是由于继承机制的原因,fstream和sstream都继承iostream,其中cin和cout,fstream和sstream都可以使用。

 

IO对象无拷贝或赋值: 

         ofstream out1,out1;//其中o(output)代表输出,f代表文件(file),定义了两个文件输出对象

         out1=out2;//错误,你能对流对象赋值

         ofstream print(ofstream);//错误不能初始化ofsream参数

         out1=print(out1);//错误,不能拷贝流对象

 

条件状态:

IO操作可以发生一些错误,IO类定义了一些函数和标志,可以帮助我们访问和操作流的条件状态。一个流一旦发生错误,其后续的IO操作都会失败,所以对它的检测是必要的。

 

#include<iostream>

using namespace std;

int main()
{
       int word;
       while(cin>>word)
       {
               cout<<word;
        }

        return word;
}

输入:1b2

 

打印:1
看结果就可以知道,当流接收的b的输入时,出错了。word本身只接受int型, 而却输入了char型,则后续的IO都失败了。所以2没有被打印出来

 

       查询流的状态:有时候我们也需要流为什么失败,因为对每个错误的原因,处理方式是不同的。

       strm::iostate,strm是一种IO类型,iostate是一种机器相关类型,提供了表达条件状态的完整性

       strm::badbit,其表示流已崩溃

       strm::failbit,其用来指出一个IO操作失败了

       strm::eofbit,其指出流达到了文件结束

       strm::goodbit,其指出流为出现错误状态,此值保证为0

      badbit表示系统初级错误(如不可恢复的读写错误),一般badbit被置位,流就无法使用了。在发生可恢复性错误后,failbit被置位,这种问题通常是可以         修正的,流还可以继续使用。在到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,保证未发生错误。如果badbit,failbit和eofbit任一个被置        位,则检测流状态的条件会失败。

       s.eof(),a.fail(),s.bad() ,s.good()这些函数查询这些标志位的状态

       s.rdstate() ,返回流s当前的状态,返回值类型为strm::iostate

       s.setstate(flags),根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void

       

       

       管理条件状态:

       流对象的rdstate成员返回一个iostate值,对应流的当前状态。setstate操作将给定条件位置位,表示发生了对应的错误。

    

       管理输出缓冲:

      每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作,由于设备         的写操作耗时,这样可以节约时间。

      导致缓冲区刷新:

      程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行

      缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区

     我们可以使用操作如enndl来显示刷新缓冲区

     在每个输出操作之后,我们可以使用操纵符unibuf设置流的内部状态,来情况缓冲区,对cerr是设置unibuf的,因此写到cerr的内容都是立即刷新

     一个输出流可能被关联到另一个流。当读写到关联的流时,关联的到流的缓冲区会被立即刷新

    flush,ends能像endl一样刷新缓冲区。ends还要向缓冲区插入一个空字符,然后刷新缓冲区。

    

  cout<<"haha"<<endl;//刷新,换换
  cout<<"hehe"<<flush;//刷新
  cout<<"hoho"<<ends;//输出hoho再加一个空字符,刷新

   

  cout<<unibuf;//所有输出都立即刷新缓冲区
  cout<<nounitbuf;//回到正常的缓冲方式

    如果程序出现错误,则输出缓冲区不会被刷新

 

    

      

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值