IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象。在fstream和sstream里定义的每种类型都是从iostream头文件中定义的相关类型派生而来。
1.IO对象不可复制和赋值
ofstream out1,out2;
out1 = out2;//错误,IO对象不可以赋值
ofstream print(ofstream);//错误,IO对象不可以复制
return 0;
注意:只支持复制的元素类型可以存储在vector或其他容器类型里。由于流对象不能复制,因此不能存储在vector(或其他)容器中。
形参和返回类型也不能为流类型。如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用。
2.输出缓冲区的管理
endl:用于输出一个换行符,用于输出一个换行符并刷新缓冲区。
flush:用于刷新流,但不在输出中添加任何字符。
注意:如果需要刷新所有输出,最好使用unitbuf操作符。这个操作符在每次执行完写操作后都刷新流:
cout<<unitbuf<<"first"<<"second"<<nounitbuf;
等价于:
cout<<"first"<<flush<<"second"<<flush;
nounitbuf操作符流将流恢复为使用正常的、由系统管理的缓冲区刷新方式。
3.文件的输入和输出
fstream头文件定义了三种支持文件IO的类型:
(1)ifstream,由istream派生而来,提供读文件的功能。
(2)ofstream,由ostream派生而来,提供写文件的功能。
(3)fstream,由iostream派生而来,提供读写同一个文件的功能。
4.文件流对象的使用
string ifile = "aaaa";//读文件名的string对象
string ofile = "bbbb";//写文件名的string对象
//c_str()函数返回一个指向正规C字符串的指针
ifstream infile(ifile.c_str()); //infile是读的流
ofstream outfile(ofile.c_str()); //outfile是写的流
注意:由于历史的原因,IO标准库使用的是C风格字符串而不是C++string类型的字符串作为文件名。
(1)检查文件打开是否成功
打开文件后,通常检验打开是否成功,这是一个好习惯:
if(!infile)
{
cerr<<"Error:unable to open input file:"
<<ifile<<endl;
return -1;
}
(2)将文件流与新文件重新绑定
fsteam对象一旦打开,就保持与指定的文件相关联。如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。
(3)文件模式
在打开文件时 ,无论是调用Open还是以文件名作为流初始化的一部分,都需要指定文件模式。
文件模式:
in:打开文件做读操作
out:打开文件做写操作
app:在每次写之前找到文件尾
ate:打开文件后立即将文件定位在文件尾
trunc:打开文件时清空已存在的文件流
binary:以二进制模式进行IO操作
(4)打开模式的有效组合
out 打开文件做写操作,删除文件中已有的数据
out | app 打开文件做写操作,在文件尾写入
out | trunc 与out模式相同
in 打开文件做读操作
in | out 打开文件做读、写操作,并定位与文件开头处
in | out | trunc 打开文件做读、写操作,删除文件中已有的数据