第十四章I/O流printf和scanf的缺陷使用时需要写出比较繁琐的格式说明;printf(“%d,%f”,i,f);编译器无法检查对它们调用的正确性;doublef;printf(“%d”,f);inti;scanf(“%d”,i);只能进行基本数据类型的输入/输出,而c++中有大量的用户自己定义的类的对象;classX{......};Xx;printf(“%?”,x);流和流类库流:数据从数据的生产者到数据的消费者的流动。流类库:提供一组类,程序利用它们可以方便的与外部世界交换数据。C++的流类库是用继承的方法建立起来的一个输入输出类库。流类库有两个基类:streambuf类和ios类;streambuf类提供对缓冲区的低级操作,如缓冲区的设置、缓冲区的读写等。ios类主要定义了用于格式化输入/输出及出错处理的成员函数。每个流都和一种与设备相联系:与输入设备(如键盘)联系的流为输入流;与输出设备(如屏幕)联系的流为输出流;C++中预定义了标准输入流cin、标准输出流cout、非缓冲的出错流cerr和缓冲的出错流clog。I/O流类层次iosistreamistrstreamistream_withassignifstreamostreamostrstreamostream_withassignofstreamiostreamfstreamstrstreamstdiostream输出流输出流对象是信息流动的目标;ostream,ofstream,ostrstreamostream类通过派生类ostream_withassign支持预先定义的流对象:cout:标准输出;cerr:标准错误输出,没有缓冲,发给它的内容立即输出;clog:类似于cerr,但有缓冲,缓冲区满时被输出;ofstream类支持磁盘文件输出;ostrstream类支持字符串输出;流插入运算符流插入运算符实现流的输出;对应每个基本数据类型,ostream流类都定义了重载运算符;ostream&operator(char*)ostream&operator(int)ostream&operator(float)可以把多个输出操作组合到一个语句中;不同类型的数据可以组合在一个语句中;inta;doubleb;coutaOKb;标准输出如果输出到标准输出设备,使用预先定义的cout、cerr、clog对象,不需要构造流对象。inta=10;couta;cerr“Error!;输出文件流类ofstream文件流类在fstream.h中定义;要将信息输出到文件,就要构造和建立ofstream流类对象,并打开文件;构造对象时指定文件名和模式:ofstream::ofstream(constchar*szName,intnMode=ios::out,intnProt=filebuf::openprot);例:ofstreamoutfile(data.dat,ios::nocreate);文件名文件打开模式文件共享方式使用ofstream类的缺省构造函数,再调用成员函数open:voidofstream::open(constchar*szName,intnMode=ios::out,intnProt=filebuf::openprot);如:ofstreamoutfile;outfile.open(data.dat,ios::binary);调用ofstream类的close成员函数关闭文件;在对象消失时,由析构函数关闭由构造函数或open成员函数打开的文件。文件打开选择项ios::app输出内容总加在末尾ios::ate输出内容加在末尾ios::in具有输入能力ios::out具有输出能力ios::trunc如果文件存在,清除文件内容ios::nocreate如果文件不存在,返回错误ios::noreplace如果文件存在,返回错误ios::binary以二进制方式打开文件(不转换字符)可以用‘|’组合打开方式文件保护方式选项Filebuf::openprot兼容共享方式Filebuf::sh_none独占,不共享Filebuf::sh_read允许读共享Filebuf::sh_write允许写共享例:向文件myfile中写入一些信息,如果文件不存在,则创建该文件方式1:构造对象时打开文件ofstreamfout(e:\\a1\\myfile.txt);foutAtest.endl;方式2:使用成员函数openofstreamfout;fout.open(e:\\a1\\myfile.txt);foutAtest.endl;向文件myfile中追加一些信息:方式1:构造对象时打开文件ofstreamfout(e:\\myfile.txt,ios::ate);foutAnewfileendl;方式2:调用成员函数openofstreamfout;fout.open(e:\\myfile.txt,ios::ate);foutAnewfileendl;文件输出示例#includefstream.hvoidmain(){char*name=QWERTYPOIUYT;intage=49;floatsalary=600.123f;ofstreamfout(TEST.TXT);fout此行写入了TEST.TXT中\n;foutnameagesalary;fout.close();}输出串流类ostrstream串流类在strstream.h中定义;ostrstream::ostrstream(char*pch,intnLength,intnMode=ios::out);pch:指向字符串数组nLength:数组大小,当字符个数超过nLength时,字符串不再接受输出nMode:流创建方式如:charstr[10];ostrstreamaout(str,sizeof(str));aoutastudentendl;输出流类成员函数put函数:输出一个字符ostream&put(charch);例:cout.put('A');ofstreamfout(data.dat,ios::ate);fout.put('A');charstr[10];ostrstreamsout(str,10);sout.put('A');write函数:将内存中的一块内容写到输出流中;ostream&write(constchar*pch,intnCount);pch:内存数据起始地址;nCount:字节数;例:chara[]={write};ofstreamfout(data.dat,ios::ate);fout.write(a,sizeof(a));cout.write(a,sizeof(a));close()函数:关闭文件;ofstreamfout;fout.open(“file1”);……fout.close();fout.open(“file2”);……fout.close();错误处理函数bad:出现不可恢复的错误,返回非0值fail:出现不可恢复的错误或一个预期条件,返回非0值good:没有错误,没有文件结束,返回非0值eof:文件结束,返回非0值clear:清除所有错误位rdstate:返回当前错误状态如:if(fout.fail())cerr“文件未打开”endl;输入流输入流对象是信息流出的源头;istream,ifstream,istrstreamistream类通过派生类istream_withassign支持预先定义的流对象cin;ifstream类支持磁盘文件输入;istrstream类支持字符串输入;流提取运算符流提取运算符实现流的输入;对应每个基本数据类型,istream流类都定义了重载运算符;istream&operator(char*)istream&operator(int)istream&operator(float)intn;floatf;cinnx;10037.5char*p=newint[20];cinp;abcdefghijintn;floatf;cinnx;37.510.0intn;char*p=newint[10];cinnp;100Wang输入文件流类ifstream在fstream.h中定义;构造对象时打开文件ifstream::ifstream(constchar*szName,intnMode=ios::in,intnProt=filebuf::openprot);调用成员函数voidifstream::open(constchar*szName,intnMode=ios::in,intnProt=filebuf::openprot);voidifstream::close();文件输入示例#includefstream.hvoidmain(){ifstreamfin(TEST.TXT);charline[100];charname[50];intage;floatsalary;finline;finnameagesalary;coutlineendl;coutnameagesalaryendl;fin.close();}输入串流类istrstream在strstrea.h中定义;istrstream(char*pch,intnLength);pch:字符串数组nLength:数组大小,当字符个数超过nLength时,字符串不再接受输入如:charstr[10]={student};chara[5];istrstreamai(str,sizeof(a)-1);aia;输入流类成员函数get函数:输入一个字符或一系列字符charget();istream&get(char&rch);istream&get(char*pch,intnCount,chardelim='\n');如:chara[10];inti=0;ifstreamfin(data.dat);while(!fin.eof()&&(isizeof(a))){a[i]=fin.get();//输入带空格//如果用fina[i];自动过滤空格i++;}fin.get(a,10);getline函数:读取输入行;istream&getline(char*pch,intnCount,chardelim='\n');//从流中向存储器pch读入多个字符,直到遇到以下情况之一:1.所读字符个数将达到nCount;2.将遇到终止字符;3.文件结束。read函数:从输入流中读取指定数目的字符istream&read(char*pch,intnCount);如:chard[100];ifstreamfin(data.dat);fin.read(d,20);seekg函数:设置下一个将读位置的指针istream&seekg(streampospos);istream&seekg(streamoffoff,ios::seek_dirdir);pos:长整形,指针的新位置off:长整形,指针的偏移量dir:查找方式:tellg函数:返回当前文件指针streampostellg();如:从流中间隔读入字符chara[10];intpos,i=0;ifstreamfin(data.dat);while(!fin.eof()){pos=fin.tellg();pos++;fin.seekg(pos);fin.get(a[i]);i++;}输入/输出流一个iostream类的对象可以是数据的源或目的;fstream和strstream这是两个重要的I