1.IO对象时不可复制或者赋值的:也就是说形参或者返回类型也不能为流类型。如果非要传递或者返回IO对象的的话,则必须传递或者返回指向对象的指针或者引用。如: ofstream &print(ofstream&);while(print(out2)){}。对IO对象的读写会改变它的状态,因此引用必须是非const的。
2.流的条件状态:通过strm::iostate来定义流的条件状态
strm::badbit 是strm::iostate类型的值,用来指示流被破坏了。strm::failbit是strm::iostate类型的值,用来指示IO操作失败。
strm::eofbit是strm::iostate类型的值,用来指示流已到达文件结束符。
s.eof()如果设置了流的eofbit值,则函数返回true。s.fail()如果设置了流的failbit值,则函数返回true。s.bad()如果设置了流的badbit值,则函数返回true。
s.good()如果流处于有效状态,则函数返回true。s.clear()流s中的所有状态值设置为有效状态。s.clear(flag)流s中的指定的条件状态值设置为有效状态,flag是strm::iostate类型。s.restate()返回流s的当前条件状态情况,返回类型为strm::iostate类型。
3.文件的操作:主要分为五步:1.创建文件流对象(输入文件流ifstream in ,输出流 ofstream out)这里涉及到两种初始化的方式:直接法和间接法。直接法就是ifstream in(“文件名称”);间接法:ifstream in; in.open("文件名称")。2.打开文件:调用open函数(前面已经讲到)3.判断是否打开成功或者说是文件流是否绑定相应的文件。如:调用fail()函数来判断:if(in.fail()){};或者if(!in)4.进行读写操作:(将文件中的字符串读出来)读:string s; in>>s;(将字符串写进文件中)写:string s;out<<s; 5.操作完了之后别忘了关闭文件。in.close()。
3.1 文件打开模式:in 打开文件做读操作;out 打开文件做写操作;app 在每次写之前找到文件尾部;ate 打开文件后立即将文件定位在文件尾;trunc 打开文件是清空已存在的文件流;binary 以二进制模式进行IO操作。具体形式如下:
ofstream out;
out.open("文件名称",ofstream::out);(写操作模式)或者out.open("文件名称",ios::out);(写操作模式)
如果有多种模式的情况则为out.open("文件名称",ofstream::out|ofstream::in);(读写操作模式)或者out.open("文件名称",ios::out|ios::in);
3.2 模式组合方式为:out 打开文件做写操作,删除文件已有的数据;out | app 打开文件做写操作,在文件尾写入;out | trunc 与out模式相同;
in 打开文件做读操作;in | out 打开文件做读写操作,并定位于文件开头处;in|out|trunc 打开文件做读写操作,删除文件中已有的数据。
3.3 在关闭文件之后一般将文件流的标志问都设置问有效状态:in.clear()。
4. 字符串流
istringstream 和ostringstream 以及stringstream。这些类必须包含头文件sstream。
字符串流主要用在:当输入的是一行字符串的时候时,又想知道这一行当中有多少个字符串组成。此时采用字符串流来实现。
如: string line,word;
while(getline(cin,line))
{
istringstream stream(line);//将每一行的内容与字符串流绑定在一起
while(stream>>word)//一行当中的所有字符串都输出
{//此处在做相应的处理每个字符串}
}