标准库定义了一族类型,支持控制窗口、文件和string对象的读写操作,这三种操作分别定义在iostream、fstream和sstream三种头文件中,它们包含了istream、ostream、iostream;ifstream、ofstream、fstream;istringstream、ostringstream、stringstream等IO类型,它们的基本继承关系如下所示:
条件状态:IO标准库管理一系列条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种
特定的错误。
条件状态的种类:badbit标志,系统级故障,无法恢复;failbit标志,可恢复错误;eofbit标志,遇到文
件结束符设置。
IO标准库的条件状态和操作:
strm::iostate //用于定义条件状态
strm::badbit
strm::failbit
strm::eofbit
s.eof() //如果设置了eofbit,则函数返回true
s.fail()
s.bad()
s.good() //如果流处于有效状态则返回true
s.clear() //将流中的所有状态值都清空
s.clear(flag) //将指定条件状态清空,flag类型为strm::iostate
s.setstate(flag) //给流s添加指定条件
s.rdstate() //得到当前条件状态
缓冲区的刷新:
程序正常结束
当缓冲区已经满了,缓冲区写入下一个值之前刷新
操作显示刷新,包括endl、flush、ends,如,cout << "hi!" << flush;
unitbuf操作符设置值流内部状态,从而清空缓冲区,如果需要刷新所有输入,最好使用unitbuf操
作符,使用方法例如,cout << unitbuf << "first" << "second" << nounitbuf;
输出流与输入流关联,如:cin.tie(&cout)绑定、cin.tie()返回绑定流、cin.tie(0)解除绑定
文件的输入和输出
两种打开文件的方式:
直接调用含有文件名的构造函数如:ifstream infile(ifile.c_str())、ofstream outfile(ofile.c_str())
采用默认构造函数,调用open成员函数如:ifstream infile,infile.open(infile_cstr())
一个打开并检查输入文件的程序
ifstream& open_file(ifstream &in, const string &file)
{
in.close();
in.clear(); //关闭流并不能改变流对象的内部状态,所以要调用clear()
成员函数清空以前的错误条件状态
in.open(file.c_str());
return in;
}
文件模式:
in //用于指定与ifstream或fstream关联的文件,默认ifstream打开模式
out //用于指定与ofstream或fstream关联的文件,默认ofstream打开模式,
文件会被清空
app //每次写之前找到文件尾
ate //可以关联所有文件,打开后立即定位到文件尾
trunc //打开文件时,清空已存在在的文件流
binary //可以关联所有文件
注:fstream默认以in和out模式打开,不清空数据。
打开模式的有效组合
out
out | app
out | trunc //效果与out相同
in
in | out
in | out | trunc //读写操作,删除已有数据
注:上述打开模式都可以添加ate模式
字符串流
三种类型的字符串流:istringstream、ostringstream、stringstream
特定操作:
stringstream strm //创建自由的stringstream对象
stringstream strm(s) //存储字符串副本的stringstream对象
strm.str() //返回string对象
strm.str(s) //将字符串赋给strm
stringstream的两种应用:
将一行字符,分割为若干个单词
string line, word;
while(getline(cin, line))
{
istringstream stream(line);
while(stream >> word){ processing(); }
}
多种数据类型之间实现自动格式转换:用法参见258页