一、IO类
IO库类型和头文件
头文件 | 类型 |
iostream | istream 从流中读取数据 ostream 向流写入数据 iostream 读写流 |
fstream | ifstream 从文件中读取数据 ofstream 文件写入数据 fstream 读写文件 |
sstream
| istringstream 从string读取数据 ostringstream 向string写入数据 stringstream 读写string |
由于ifstream 和istringstream都继承自istream。因此我们可以像使用istream对象一样来使用ifstream和istringstram对象。
(继承:程序设计功能,令一个类型可以从另一个类型继承接口。)
eg: ostringstream out1;
string test(4,‘r’);
out1 << test <<endl; //可以向ostringstream对象写入string数据
IO对象无拷贝或赋值
注意:因为我们不能对IO对象进行拷贝或者赋值操作
因此以下操作一定要避免
1. 将流类型设置为形参或者返回类型
2.传递和返回流的引用不能是const的(读写IO对象就会改变其状态)
条件状态
定义:可以被任何流类使用的一组标志和函数,用来指定给定流是否可用。
IO库条件状态
strm::iostate | strm是一种IO类型,提供表达条件状态的完整功能 |
strm::badbit | 指出流已经崩溃 |
strm::failbit | 指出一个IO操作失败了 |
strm::eofbit | 用来指出流已经到达文件尾 |
strm::goodbit | 用来指出流位处于错误状态 |
s.eof() | 若流s, eofbit置位,返回true |
s.fail() | 若流的failbit,bad置位,返回true |
s.bad() | bad位置位,返回true |
s.good() | 若流处于有效状态,返回true |
s.clear() | 将流s中所有条件状态位复位,流的状态设置为有效 |
s.clear(flag) | 根据给定娥fl复位ags标志位,将流s中对应条件状态复位 |
s.setstate(flags) | 根据给定娥fl复位ags标志位,将流s中对应条件状态置位 |
s.rdstate | 返回流s的当前条件状态,返回值类型位strm:iostate |
输出缓冲区
每个输出流都管理一个缓冲区,用来保存程序读写的数据。
eg: os << "ok";
文本字符串可能立即打印出来,但也有可能被操作系统保存在缓冲区内,随后再打印。
好处:设备的写操作很费时,如果操作系统将多个输出操作组合为一个单一的设备写操作可以带来很大的性能提升。
刷新输出缓冲区的操作
cout << "hi" << endl; //输出一个hi 换行 后刷新
cout << "hi" << flush;//输出 “hi” 后刷新
cout << "hi" << ends;//输出 “hi” 空字符 后刷新
unitbuf
执行cout << unitbuf 所有输出操作后都会立即刷新缓冲区
执行cout << nounitbuf 回到正常的缓冲方式
关联输入和输出流
当一个输入流被关联道一个输出流是,任何试图从输入流读取数据的操作都会先刷新关联的输出流,标准库讲过cout和cin关联在一起,因此下面的语句
cin >> ival;
导致cout的缓冲区被刷新。
(交互式系统一你该关联输入输出流。这意味着所有输出,包括用户提示信息,都会在读操作之前被打印出来)
文件输入输出
头文件fstream定义了三个类型支持文件IO:
ifstream从一个给定文件读取数据
ofstream向一个给定文件写入数据
fstream可以读写给定文件
fstream特有的操作
fstream fstrm 创建一个未绑定的文件流,fstream是头文件fstream中定义的一个类型
fstream fstrm(s) 创建一个fstream,并打开名为s的文件。s可以是string类型,或者是一个指向C风格字符串的指针。这些构造
函数都是explicit。
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开文件
fstrm.open(s) 打开名为s的文件,并将fstrm绑定。s可以是一个string或一个指向C风格字符串的指针。默认的文件mode
依赖于fstream的类型。返回void
fstrm.close() 关闭与fstrm绑定的文件。返回void
fstrm.is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
使用文件流对象
成员函数open和close
如果我们定义了一个空文件流对象,可以随后调用open来将他与文件关联起来
ifstrem in(ifile); //构建一个ifstream并打开给定文件
ofstream out; //输出文件未与任何文件相关联
out.open(ifile + ".copy"); //打开指定文件
一旦一个文件流已经打开,他就保持对应文件的关联,实际上,对一个已经打开的文件流调用open就会失败,并会导致failbit被置位,随后的试图使用文件流的操作都会失败,。为了将文件流关联到另外一个文件,必须先关闭已经关联的文件。
in.close(); //关闭文件
in.open(ifile + "2");
自动构造和析构
当一个fstream对象被销毁时,close会被自动调用。