第8章 IO库

8.1 IO类

       为了进行IO操作,分别定义三个独立的文件iostream用于读写流的基本操作,fstream用于读写命名文件的操作,sstream用于读写内存string对象类型。
wchar_t的数据分别用wcin,wcout和wcerr进行。

8.1.1 IO对象无拷贝和赋值

ofstream out1,out2;
out1 = out2;//错误
ofstream print(ofstream);//错误不能初始化ofstream
out2 = print(out2);//错误不能拷贝流对象
传递和返回的引用不能是const的

8.1.2条件状态

在使用一个流之前需要检查是否处于良好状态,确定一个流对象的状态最简单的办法就是将它作为一个条件来使用。
strm::iostate  表示条件状态的完整类型
strm::badbit  指示流已经崩溃
strm::failbit   指示IO操作失败
strm::eofbit   指示达到文件结尾
strm::goodbit 指示流未处于错误状态,此值为0
s.eof()  若 eofbit赋值则为true
s.fail()   若出错则返回true
s.bad()  若badbit赋值则为true
s.good() 若good有效则true
s.clear() 将流设置为有效
s.clear(flags) 根据flags,将其复位
s.setstate(flags) 根据flags,将其复位
s.rdstate() 返回流s当前条件。
查询流的状态
iostate类型,提供了表达流完整状态功能。应作为位集合来使用。
badbit表示系统级错误,流无法使用。
failbit 表示可恢复错误,如读取错误,流可以继续使用。
达到文件结尾eofbit和failbit都会被置位。
goodbit的值为0,表示流未发生错误。
badbit被置位时候,failbit也会被置位。
管理条件状态
流对象的rdstate成员返回一个iostate值,setstate将会给定条件置位。
clear不带参数,清理所有错误标志。
cin.clear(cin.rdstate()&~cin.failbit &~cin.badbit);

8.1.3管理输出缓存

缓存刷新
1.程序正常结束
2.缓冲区满
3.使用操作符endl
4.用操作符unitbuf
5.输出流关联到另外一个流
刷新输出缓冲区
endl,fulsh,ends都可以刷新缓存。
unitbuf操作符
设置unitbuf表示每次写操作之后都进行一次flush.nonunitbuf则重置流。
关联输入和输出流
tie有两个版本,一个不带参数,返回指向输出流的指针
一个接受ostream对象,将自己关联到ostream。

8.2文件输入输出

fstream fstrm 创建一个未绑定的文件流。
fstream fstrm(s);创建一个fstream,并打开名为s的文件。
fstream fstrm(s,mode);按照mode模式打开
fstrm.open(s)   打开名为s的文件,并且与fstrm绑定。
fstrm.close()  关闭与fstrm绑定文件
fstrm.is_open() 判断是否打开
8.2.1 使用文件流对象
用fstream代替iostream&
成员函数open和close
ifstream in(file);
ofstream out;
out.open(ifile+".copy");//打开指定文件
如果调用open失败,failbit会被置位。
自动构造和析构
       当一个fstream对象离开了其作用域,与之关联的对象自动关闭。当一个fstream对象被销毁时候,close会被自动执行。

8.2.2文件模式

in  以读的方式打开
out 以写的方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件立即定位到末尾
trunc 截断文件
binary 以二进制方式进行IO
1.只可以对ofstream或fstream设定为out
2.只可以对ifstream或fstream设定为in
3.只有out被设定时候,才可以设为trunc
4.只要trunc没被设定,可以设定为app。
5.默认情况下没有设置trunc,只要设置out,也会被截断。必须out和app模式才会追加到末尾或者单独app.
6.ate和binary可以用于任何类型的文件。
fstream默认是in和out模式打开
以out模式打开会丢失已有数据
ofstream out("aaa");//打开文件并截断文件
ofstream out("bbb",ofstream::out|ofstream::app)//打开并在文件末尾写入。

8.3 string 流

sstream是头文件名,istringstream从string读取数据,ostringstream向string写入数据,stringstream是既可以读又可以写。
sstream strm; strm未绑定stringstream对象
sstream strm(s); strm保存s的一个拷贝。
strm.str() ;返回strm保存s的拷贝
strm.str(s); 将string s拷贝到strm中
使用istringstream
struct PersonInfo{
string name;
vector<string> phones;
}
string line,word;
vector<PersonInfo> people;
while(getline(cin,line)){
PersonInfo info;
istringstream record(line);
record>>info.name;
while(record>>word)
   info.phones.push_back(word);
people.push_back(info);
}

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值