输出缓冲区的处理
导致缓冲区刷新的操作(即将缓冲区的内容写到真实的输出设备或者文件):
1程序正常结束,return语句将清空所有缓冲区
2缓冲区已满,将在写下一个值之前刷新
3使用操纵符刷新,如endl、flush、ends等
4每次输出完成后,用unitbuf的何止设置流的内部状态,清空缓冲区
5将输入输出流关联(tie)起来,在读输入流时将刷新与其关联的输出缓冲区
说明:
cout<<”hi”<<flush; //刷新缓冲区不添加任何字符
cout<<”hi”<<ends; //刷新缓冲区并插入空字符null
cout<<”hi”<<endl; //刷新缓冲区并添加换行符
cout<<unitbuf<<”hi”<<”hello”<<nounitbuf;等价于
cout<<”hi”<<flush<<”hello”<<flush; //nounitbuf将流恢复成使用正常的、由系统管理的缓冲区刷新方式
绑定输入输出:
c.tie(&cout);
ostream *old_tie=cin.tie();
cin.tie(0); //破坏cin和cout之间的绑定
cin.tie(&cerr); //重新绑定cin和cerr
流状态的查询和控制
int val;
while(cin>>val,!cin.eof())
{
if(cin.bad())
{throw runtime_error("IO stream corrupted");}
if(cin.fail());
{
cerr<<"bad data,try again";
cin.clear(istream::failbit); //有时编译器不编译这个命令,可改成cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); //忽略错误输入,等价于cin.ignore(200,'\n');
continue;
}
}
文件流对象的使用
ifstream infile(ifile.c_str()); //读文件
ofstream outfile(ofile.c_str());//写文件
创建了两个读写文件流对象infile和outfile,并分别与存储读写的文件名的string对象ifile和ofile绑定在一起,函数c_str返回string对象的C风格字符串表示,即指向字符数组首地址的指针(因为IO标准库使用C风格字符串而非string类型作为文件名)。上述代码也可以写成:
Ifstream infile;
Infile.open(“in”); //”in”是需要读的文件名,为C风格字符串
Ofstream outfile;
Outfile.open(“out”);//”out”是需要写的文件名,为C风格字符串
文件模式(是文件的属性而不是流的属性)
文件模式有:in,out,app,ate,trunk,binary等,其中in是ifstream对象关联的文件模式,out,app,trunc是ofstream对象关联的文件模式,而ate,binary和所有文件都关联。
默认情况下,ifstream和ofstream对象以in和out模式打开文件,注意:out模式会清空文件(等效于out和trunc模式同时有效),为防止清空,唯一方法是指定以app模式打开文件:
Ofstream outfile(“filename”,ofstream::app);
注意:若fstream对象同时指定out和in模式,则不清空文件;若只有out模式,则清空文件;而若指定trunc模式,则无论是否指定in模式,文件都会被清空。
fstream inout(“filename”,fstream::in|fstream::out);//同时指定两种模式采用位操作