C++11(7):IO库

iostream        istream,ostream ,iostream
fstream        ifstream,ofstream, fstream
sstream        sstringstream,ostringstream,stringstream
为了支持宽字符wchar_t,在函数和类型名前加w,wcin,wistream
我们不能拷贝或对IO对象赋值,进行IO操作的函数通常以引用方式传递和返回流,读写时会改变其状态,因此传递和返回的引用不能使const的

条件状态:
strm::iostate    strm是一种IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能,有以下四个值,枚举类型
strm::badbit    用来指出流已崩溃   发生错误后流无法再使用,
strm::failbit    用来指出一个IO操作失败了,如期望出现数值却读的是char,错误后流还能使用
strm::eofbit     用来指出流到达了文件结束
strm::goodbit    用来指出流未处于错误状态,此值保证为零。
s.eof()   若流s的eofbit位置,则返回true
s.fail()    若流s的failbit或badbit位置,则返回true
s.bad()    若流s的badbit位置,则返回true
s.good()    若流s处于有效状态,则放回true
s.clear(flags)    根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate.返回void
s.setstate(flags)    根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate  返回void,表示发生对应的错误
s.rdstate()    返回流s的当前状态,返回状态位strm::iostate

文件结束eofbit和failbit会被置位
我们将流当做条件使用的代码就等于!fail()。而eof和bad操作只能表示特定的错误
为了复位单一的条件状态,我们首先用rdstate读出当前条件状态,然后用位操作将所需位复位来生成新的状态。例如:
下面的代码将failbit和badbit复位,但保持eofbit不变
cin.clear(cin.rdstate() & ~ cin.failbit & ~ cin.badbit);

每个输出流都管理一个缓冲区,用来保存程序读写的数据。如下情况刷新缓冲区
程序真正的结束,作为main函数的return操作的一部分,缓冲刷新被执行
缓冲区满,只有刷新新数据才能进来
endl显式刷新
在每个输出操作之后,我们可以用操纵符unitbu设置流内部状态,来清空缓冲区。默认情况下,对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; //回到正常的缓冲方式

如果程序崩溃,输出缓冲区不会被刷新,输出数据被挂起没有打印

当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流
tie有俩个版本,不带参数,返回对象关联流的指针,如果无关联输出空指。带参数的版本,接受一个ostream指针将自己关联到此ostream
我们既可以将一个istream对象关联一个ostream,也可以将一个ostream关联到另一个ostream
cin.tie(&cerr);  //读取cin会刷新cerr而不是cout

除了继承自iostream类型的行为之外,fstream还定义了自己的成员
fstream  fstrm;     创建一个未绑定的文件流
fstream fstrm(S);     创建一个fstream,并打开s的文件。s可以使string类型或者是一个指向c风格的字符串的指针,这些构造函数都是explicit
fstream fstrm(s, mode);    与前一个构造函数类似,但按指定mode打开
fstream.open(s);          打开名为s的文件,并将文件与fstrm绑定。默认的人间mode依赖于fstream的类型,返回void
fstrm.close()       关闭文件绑定,返回void
fstrm。is_open()            返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
如果open成功,则open()会设置流的状态吧,使得good()为true;
当一个fstream对象被销毁时,close会自动被调用

in 打开文件做读操作
out 打开文件做写操作
app 在每次写之前找到文件尾
ate 打开文件后立即将文件定位在文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行 IO 操作
out 打开文件做写操作,删除文件中已有的数据
out | app 打开文件做写操作,在文件尾写入
out | trunc 与 out 模式相同
in 打开文件做读操作
in | out 打开文件做读、写操作,并定位于文件开头处
in | out | trunc 打开文件做读、写操作,删除文件中已有的数据
文件模式
out模式打开的文件会丢失已有数据,保留ofstream打开文件中已有数据的唯一方法是显示指定opp或in
close()重新 open()会重新确定文件模式

stringstream特有的操作
 
sstream strm
sstream strm(s)
strm.str()            返回strm所保持的string的拷贝
strm.str(s)           将string s拷贝到strm中,放回void

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值