IO 对象 不可复制或赋值
形参或返回类型不能是流类型,可以通过传递或返回指向该对象的指针或引用 来传递和返回IO 对象。
所有流对象都包含一个条件状态成员,类型为iostate 类型
流的状态由 bad , fail ,eof 和 good 操作解释,如果 bad,fail 或者 eof 任意一个为 true ,则检查流本身将显示该流处于错误状态。反之,如果三个没有一个是true ,则 good 操作将返回 true。
流的状态成员有setstate 和 clear 操作管理。
clear: 将条件重设为有效状态。
setstate: 打开某个指定的条件,用于表示某个问题的发生。
书中课后题:
编写一个函数,其唯一的形参和返回值都是istream& 类型,该函数应一直读取流直到到达文件结束符。并将读到的内容输出,最后,重设流设其有效,并返回流。
istream& testIO(istream &ist){string s;while(ist>>s,!ist.eof()){assert(!ist.bad());if(ist.fail()){cerr<<"bad data, try again";ist.clear(istream::goodbit);continue;}cout<<"your input:"<<s<<endl;}
ist.clear();return ist;}
输出缓冲区管理:
1输出缓冲区刷新: 1) endl: 输出一个换行符并刷新缓冲区; 2)flush不在输出添加任何字符,刷新; 3)ends: 在缓冲区中插入空字符null,然后刷新。
2,unitbuf 操作符: 需要刷新所有输出时使用。在每次执行完写操作后都刷新流。
EX: cout<<unitbuf<<"first"<<"second"<<nounitbuf;
等价于 :cout<<"first"<<flush<<"second"<<flush;
nounitbuf 使流恢复为正常的,由系统管理的刷新方式。
注意: 程序崩溃,不会刷新缓冲区; 所以最好保证在程序中所有的输出操作都显示调用了flush 或 endl
3、输入和输出绑在一起: 任何读输入流的尝试都将首先刷新其输出流关联的缓冲区。
tie 函数 可用istream 或 ostream 对象调用。tie 的形参是指向ostream对象的指针。
文件的输入和读出
fstream 头文件 定义了三种支持文件IO 的类型:
1)ifstream 由 istream 派生, 提供读文件
2)ofstream 由ostream 派生, ....写......
3)fstream 由iostream 派生,....读写同一个文件的功能。
两个操作: open() 和 close()
参数都是文件名,使用C风格字符串,用string.c_str()
检查文件打开是否成功:
ifstream infile;
infile.open("in");
if(!infile) { 打开失败 }
。。。。
如果重用文件流读写多个文件,必须在读另一个文件之前调用clear 清除该流的状态。
文件模式:
in :读操作
out: 写操作
app: 每次写之前找到文件尾
ate: 打开文件后立即将文件定位到文件尾。 (只在打开时有效)
trunc : 打开文件清空已存在的文件流
binary: 二进制模式进行IO操作。
注意: ofstream 对象指定out 模式等效于 同时指定了 out 和 trunc 模式
EX: ofstream outfile("file");
等价于 ofstream outfile("file", ofstream::out | ofstream::trunc);
字符串流:
sstream 头文字
1)istringstream 由 istream 派生. 提供读string
2)ostringstream 由 ostream派生, 写
3)stringstream 由 iostream 派生, 读写
stringstream 的操作:
stringstream strm: 创建对象
stringstream strm(s); 创建存储s的副本的stringstream对象,s是string类型对象
strm.str() 返回strm中存储的string类型对象
strm.str(s) 将string类型的s复制给strm,返回void