IO类
基本内容
iostream库包含两个基础类型: istream , ostream 。
cin: 一个istream对象,用来从标准输入读取数据
cout:同cin
cerr:用于输出程序错误信息,写到标准错误。
方法:
getline() :从一个给定的istream读取一行数据,存入给定的string对象中。
其他IO类型
除了iostream用于读写流的基本类型,还有其他不同种类的IO处理操作:
- fstream:用于读写命名文件
- sstream:用于读写内存string对象
fstream头文件定义了ifstream,ofstream,fstream三种类型。
sstream头文件定义了istringstream,ostringstream,stringstream三种类型。
ifstream,istringstream都继承自istream ,故可使用cin和getline函数。
out 同理。
io类所定义的一些函数和标志
io操作与生俱来的问题就是可能发生错误。
标志(flags)
- strm::iostate 是一种机器相关的类型,提供表达条件状态的完整功能。
- strm::badbit 用来指出流以崩溃---------------------------------------------------------------系统级错误
- strm::failbit 用来指出一个io操作失败了----------------------------------------------------可恢复错误
- strm::eofbit 用来指出流到达了文件结束
- strm::goodbit 用来指出流为处于错误状态。此值保证为0.
函数
- s.eof() 若流s的eofbit置位,返回true。
- s.fail() 若流s的failbit,badbit置位,返回true。
- s.baf() 若流s的badbit置位,返回true。
- s.good() 若流s处于有效状态,返回true。
- s.clear() 将流中所有条件状态位复位,流的状态设置为有效。返回void。
- s.clear(flags) 根据给定的flags标志位复位。返回void。
- s.setstate(flags) 根据给定flags,将s对应的状态 置位。返回void。
- s.rdstate() 返回流s的当前条件状态,返回值类型位strm::iostate。
只有当一个流处于无错状态时,我们才可以从它读取数据,向它写入数据。
最简单的方法:
while(cin>>word){
//操作
}
good和fail是确定流的总体情况的正确方法。
而eof和bad只能表示特定错误。
管理条件状态
使用autu自动获取cin的状态的类型
auto old_state = cin.rdstate();
便可以使用状态条件的函数
cin.setstate(old_state);
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);//将failbit,badbit复位,eofbit不变。
管理输出缓存
每个输出流都管理一个缓存区
有了缓存机制,可以带来很大的性能提升。
导致缓存刷新的原因
- 程序正常结束(main函数return)
- 缓存区已满
- 可以使用endl显式刷新缓存区
- 可以使用操作符unitbuf设置流内部状态,来清空缓存区。默认情况下,cerr是设置unitbuf的,写入cerr的内容都是立刻刷新。
- 一个输出流可能被关联到另一个流。当读写被关联流时,关联到的流会自动刷新。例如,默认情况下,cin和cerr都关联到cout。因此读cin或写cerr都会导致cout缓存区刷新。
刷新输出缓存区
cout<<endl;
cout<<flush;
cout<<ends;
unitbuf操作符
如果想每次输出操作后都刷新缓存区,使用unitbuf。
cout<<unitbuf;
回到正常缓存方式
cout<<nounitbuf;
关联输入输出流
交互式系统应该关联输入输出流。
cin.tie();
返回cin关联到的流指针。
cin.tie(&cout);
将cin关联到cout
cin.tie(nullptr);
解关联
每个流同时最多关联到一个流。
但多个流可以同时关联到同一个流。
文件输出输出
除了继承自iostream类型的行为外,fstream中定义的类型还增加了一些新的成员来管理与流相关的文件。
- 创建一个未绑定的文件流。
fstream fstrm;
- 创建一个fstream,并打开名为s的文件。s可以是string,也可以是c风格字符串指针。这些构造函数都是explicit的(不能使用拷贝初始化,例如
fstream f = "c/a.txt";
),默认的文件模式依赖于fstream类型。
fstream fstrm(s);
-
fstream fstrm(s,mode);
按指定类型打开文件。
-
fstrm.open(s);
打开名为s的文件。
-
fstrm.close();
关闭文件,返回void。
-
fstrm.is_open();
返回bool。
使用文件流对象
例如
ifstream in(ifile);
ofstream out;
out.open(ifile+".copy");
检查文件是否打开
if(out){}
对一个已经打开的文件流调用open会导致failbit被置位。
想将文件流关联到另一个文件需要:
in.close();
in.open(ifile+"2");
自动构造和析构
ifstream input(s);
在离开作用域后会自动析构。
不需要调用input.close();
文件模式
in 只读
out 只写
app 每次写操作前定义到文件末尾
ate 打开文件后立刻定义到文件末尾
trunc 截断文件(与out一同使用,默认情况out模式打开文件也会被阶截断)。
binary 以二进制方式进行IO
不使用截断文件的out需要。
ofstream out(“file”,ofstream::out | ofstream::app);
ofstream out(“file”, ofstream::app);