您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 17、输入输出流、文件操作
程序设计实习第十七讲输入输出流和文件操作输入输出流流的概念模型C++中与流操作相关的类及其继承关系输入输出流对象:cin,cout,cerr,clog输出流输入流无格式输入输出流操纵算子流格式状态流的概念模型流-可以看作一个无限长的二进制数字序列通过读写指针进行流的读和写(以字节为单位)~10101110~~10101110~将流上的数据读进变量x1010111011100010将y的值写入流yx流的概念模型输出流可以看作一端无限,另一端通过写指针不停地向后写入新内容的单向流,1100011010~写指针流的概念模型输入流可以看作一端无限,另一端通过读指针不停地从流中读取新内容的单向流,读出的内容从流中删去。1100011010~读指针有格式读写和无格式读写字符方式/二进制方式读写有格式读写,以某种数据类型为单位读写例如:读一个整数,写一个浮点数等;无格式读写,以字节为单位读写,不区分其中的内容例如:读20个字节,写50个字节等;缓冲区刷新向输出流中写数据时,通常是先向缓冲区中写,当缓冲区写满时,才真正向输出流写;也可以通过函数在程序中主动将缓冲区内容写入输出流。C++中与流操作相关的类及其继承关系iosistreamostreamifstreamiostreamofstreamfstream标准流对象输入流对象:cin与标准输入设备相连输出流对象:cout与标准输出设备相连cerr与标准错误输出设备相连非缓冲输出clog与标准错误输出设备相连缓冲输出输出流流插入运算符cout“Goodmorning!\n”;不刷新缓冲区cout“Good”;不刷新缓冲区cout“morning!”;不刷新缓冲区coutendl;刷新缓冲区coutflush;刷新缓冲区输出流用成员函数put输出字符cout.put(‘A’);put的连续使用cout.put(‘A’).put(‘a’);输入流读取运算的返回值重载运算符的定义:istream&operator(istream&input,A&a){…….returninput;}返回的是输入流的引用(引用本身是地址),在读取不成功时,该地址被置成0.所以可以用如下方法判输入结束:intx;while(cinx){…}输入流成员函数cin.get()读入一个字符(包括空白字符),返回该字符;cin.get(char*buffer,intsize,chardelim=‘\n’)或者读size–1个字符入buffer,或者遇到‘\n’;在buffer最后加‘\0’,分隔符留在输入流.cin.getline(char*buffer,intsize,chardelim=‘\n’)或者读size–1个字符入buffer,或者遇到‘\n’;在buffer最后加‘\0’,分隔符从流去掉.cin.eof()返回输入是否结束标志.输入流其它函数cin.peek();返回下一个字符,但不从流中去掉.putback(charch);将字符ch放回输入流ignore(intnCount=1,intdelim=EOF);从流中删掉最多nCount个字符,遇到EOF时结束。无格式输入输出用read,write进行指定字节数的输入输出constintSIZE=80;charbuffer[SIZE];cin.read(buffer,20);cout.write(buffer,cin.gcount());//gcount返回上次读入的字节数coutendl;输入:Usingtheread,writeandgcountmemberfunctions输出:Usingtheread,write流操纵算子整数流的基数:流操纵算子dec,oct,hex,setbase浮点数的精度(precision,setprecision)设置域宽(setw,width)用户自定义的流操纵算子使用流操纵算子需要#includeiomanip流操纵算子整数流的基数:流操纵算子dec,oct,hexintn=10;coutnendl;couthexn“\n”decn“\n”octnendl;输出结果:10a1012控制浮点数精度的流操纵算子precision,setprecisionprecision是成员函数,其调用方式为:cout.precision(5);setprecision是流操作算子,其调用方式为:coutsetprecision(5);//可以连续输出它们的功能相同。指定输出浮点数的有效位数浮点数输出最多6位有效数字#includeiostream#includeiomanipusingnamespacestd;intmain(){doublex=1234567.89,y=12.34567;intn=1234567;intm=12;coutsetprecision(6)xendlyendlnendlm;}控制浮点数精度的流操纵算子输出:1.23457e+00612.3457123456712以小数点位置固定的方式输出#includeiostream#includeiomanipusingnamespacestd;intmain(){doublex=1234567.89,y=12.34567;intn=1234567;intm=12;coutsetiosflags(ios::fixed)setprecision(6)xendlyendlnendlm;}控制浮点数精度的流操纵算子输出:1234567.89000012.345670123456712取消以小数点位置固定的方式输出#includeiostream#includeiomanipusingnamespacestd;intmain(){doublex=1234567.89;coutsetiosflags(ios::fixed)setprecision(6)xendlresetiosflags(ios::fixed)x;}控制浮点数精度的流操纵算子输出:1234567.8900001.23457e+006设置域宽的流操纵算子设置域宽(setw,width)两者功能相同,一个是成员函数,另一个是流操作算子,调用方式不同:cinsetw(5);或者cin.width(5);coutsetw(5);或者cout.width(5);设置域宽的流操纵算子设置域宽(setw,width)例:intw=4;输入:1234567890charstring[10];输出:1234cin.width(5);5678while(cinstring){90cout.width(w++);coutstringendl;cin.width(5);}设置域宽的流操纵算子设置域宽(setw,width)需要注意的是在每次读入和输出之前都要设置宽度。例如:charstr[10];输入:1234567890cin.width(5);输出:1234cinstring;567890coutstringendl;cinstring;coutstringendl;设置域宽的流操纵算子设置域宽(setw,width)需要注意的是在每次读入和输出之前都要设置宽度。例如:charstr[10];输入:1234567890cin.width(5);输出:1234cinstring;5678coutstringendl;cin.width(5);cinstring;coutstringendl;用户自定义流操纵算子ostream&tab(ostream&output){returnoutput'\t';}cout“aa”tab“bb”endl;输出:aabb为什么可以?用户自定义流操纵算子因为iostream里对进行了重载(成员函数)ostream&operator(ostream&(*p)(ostream&));文件操作数据的层次文件和流建立顺序文件文件的读写指针有格式读写无格式读写数据的层次位bit字节byte域/记录例如:学生记录intID;charname[10];intage;intrank[10];我们将所有记录顺序地写入一个文件,称为顺序文件。文件和流可以将顺序文件看作一个有限字符构成的顺序字符流,然后象对cin,cout一样的读写。回顾一下输入输出流类的结构层次:iosistreamostreamifstreamiostreamofstreamfstream建立顺序文件#includefstream.h//包含头文件ofstreamoutFile(“clients.dat”,ios::out|ios::binary);//打开文件ofstream是fstream中定义的类outFile是我们定义的ofstream类的对象“clients.dat”是将要建立的文件的文件名ios::out是打开并建立文件的选项ios:out输出到文件,删除原有内容ios::app输出到文件,保留原有内容,总是在尾部添加ios::ate输出到文件,保留原有内容,可以在文件任意位置添加ios::binary以二进制文件格式打开文件建立顺序文件也可以先创建ofstream对象,再用open函数打开ofstreamfout;fout.open(test.out,ios::out|ios::binary);判断打开是否成功:if(!fout){cerr“Fileopenerror!”endl;}文件的读写指针对于输入文件,有一个读指针;对于输出文件,有一个写指针;对于输入输出文件,有一个读写指针;标识文件操作的当前位置,该指针在哪里,读写操作就在哪里进行。文件的读写指针ofstreamfout(“a1.out”,ios::ate);longlocation=fout.tellp();//取得写指针的位置location=10L;fout.seekp(location);//将写指针移动到第10个字节处fout.seekp(location,ios::beg);//从头数locationfout.seekp(location,ios::cur);//从当前位置数locationfout.seekp(location,ios::end);//从尾部数locationlocation可以为负值文件的读写指针ifstreamfin(“a1.in”,ios::ate);longlocation=fin.tellg();//取得读指针的位置location=10L;fin.seekg(location);//将读指针移动到第10个字节处fin.seekg(location,ios::beg);//从头数locationfin.seekg(location,ios::cur);//从当前位置数locationfin.seekg(location,ios::end);//从尾部数locationlocation可以为负值字符文件读写intx,y;//有类型的读写finxy;foutx““yendl;说明:字符文件的读写本质是将所有类型转为字符串,再将字符串转成各种类型的数据。所以写出来的是文本格式的文件。可以在记事本中阅读。因为文件流也是流,所以前面讲过的流的成员函数和流操作算子也同样适用于文件流。二进制文件读写intx=10;fout.seekp(20,ios::beg);fout.write(constchar*)(&x),siz
本文标题:17、输入输出流、文件操作
链接地址:https://www.777doc.com/doc-3639767 .html