第8章数据流与文件的输入输出_第1页
第8章数据流与文件的输入输出_第2页
第8章数据流与文件的输入输出_第3页
第8章数据流与文件的输入输出_第4页
第8章数据流与文件的输入输出_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8草C++的I/0系统8.1知识要点C++语言的“流”是指信息从外部输入设备(如键盘、磁盘等)向计算机内部(内存)输入和从内存向外部输出设备(显示器、磁盘)输出的过程。这种输入输出过程被形彖地比喻为“流”。C++系统中的所有I/O类均包含在iostreain.li、fstieam.h>strstreamh这三个系统头文件中。C++系统编译预处理时,要对#include命令进行''文件包含”处理,把该命令中指定的文件中的全部内容嵌入到该命令的位置,再编译整个C++文件,生成相应的目标代码程序。“文件包含”命令可以节省程序设计人员的重复劳动,也可以共享一些相同的程序段。C卄语言不仅提供了现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了4个类对象,它们分别是cm.cout、cerrxclong用格式控制符进行格式化输入、输出〜所谓“文件”一般是指:存储在外部介质上的数据的集合。文件可用于存入程序代码,也可用于存放数据。C卄语言的文件名也是由文件的主名和扩展名两部分组成,它们之间用“・”号分隔。文件的主名是由用户命名的一个有效的C卄标识符,为了同其他软件系统兼容,一般不超过8个有效字符。C卄语言把文件看作是一个字符(字节)序列,即由一个一个字符的数据顺序组成。根据数据的组织形式可分为ASCII文件和二进制文件两种。ASCII文件又称为文本(Wxt)文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称为字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。对文件的操作要在程序中使用文件,就要在程序的开始包含预处理命令:#include<fstieam.h>对一般文件(主要是磁盘文件)的操作过程是:打开,读/写,关闭。用户对标准IO文件不需要进行打开/关闭,标准VO文件函数分为以下三种:⑴字符I/O函数字符输入函数getchai-()和字符输出函数putchar()。(2) 字符串IO函数字符串输入函数gets()和字符串输出函数puts()o(3) 格式化I/O函数格式化输入函数scanf()和格式化输出函数prmtf()o9・对字符文件的操作(1) 字符文件在字符文件中,以换行符‘5’结束的一串字符称为记录:终端屏幕上输出的一行字符就相当于一条记录:交互输入时,用户通过键盘输入,以回车键结束的一串字符也是一条记录。(2) 向字符文件写入数据向字符文件写入数据有2种方法。1)调用从ostieam流类中继承来的插入操作重载函数。使用方法同交互输出过程,但这时插入操作符的第一个操作数应是某个定义过的文件对彖而不是COUto(3) 从字符文件读取数据到内存变量从打开的字符文件中输入数据到内存变量有3种方法。10.对字节文件(二进制文件)的操作(1) 字节文件与字符文件不同的是,字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::biliary选项(2) 建立二进制文件和write。成员函数一个文件被用户定义的一个文件流对象按字节方式打开后,通过文件流对彖调用在ostream流类中定义的write()成员函数就能够向文件流对象所对应的文件中写入数据。(3) 访问二进制文件和ead()成员函数从字节文件读数据,就是把具有一定字节数的内容原原本本地复制到内存中由指定字符指针所指向的内存缓冲区中,所读内容是从当前文件指针所指位置开始读取,然后文件指针自动向后移动所读取内容的字节数。11・随机访问文件随机访问文件是可以使用位移量对其中的数据进行访问,“位移量”指以当前位置(开始点或当前位置或文件末尾)为基点,移动的字节数。C++语言既支持顺序访问文件也支持随机访问文件。为实现对文件的随机访问,fstreain文件类中定义了以下4个成员函数:seekg()>tellg()、seekp()和ellp()。seekg()fUtellg()带后缀g表示gw这两个函数用于从文件中读取数据的情况;函数seekp()和tellp()带后缀p表示put,这两个函数用于向数据文件中写数据的情况。8.2例题分析例题1:说明卞面程序的格式控制符的作用存include<iostream.h>存include<iomanip.h>voidmain(){iiitnumberl=15;doublenumber2=6.54321;cout«HDecimal:H«dec«number1«endl;cout«,,Hexadecinial:H«hex«numberl«endl;cout«,,Hexadecinial:',«hex«setiosflags(ios::uppercase)«numbeil«endl;cout«HOctal:M«oct«numberl«endl;cout«number2«endl;cout«setprecision(3);cout«number2«endl;cout«setw(15);cout«setiosflags(ios:light);cout«number2«endl;cout«setiosflags(ios:deft);cout«number2«endl;cout«setiosflags(ios::scientific);cout«number2«endl;cout«setpiecision(5);cout«setiosflags(ios::fixed);cout«number2«endl;}运行结果:Decimal:15Hexadecimal:fHexadecimal:FOctal:176.543216.546.546.546.543E+0006.5432分析:程序中使用输入输出流格式控制符,必须包含头文件ioniamp.ho整型数number=15是个十进制数,dec控制符输出十进制数;hex控制符输出十六进制数f;setiosflags(ios:uppercase)控制符输出大写十六进制数F:oct控制符输出八进制数17。结果第5行没有设置有效位数,按流的默认值6位输出3.14159。setpiecision(3)控制符设置了3位有效位数,输出3.14。setw(15)控制符设置了域宽为15,只影响下一个值的输出。setiosflags(ios::left)设置了左对齐方式;setiosflags(ios::right)设置了右对齐方式。setiosflags(ios::scientific)设置了指数表示方式。setpiecision(3)和setiosflags(ios::fixed)共同设置了浮点数表示方式。例题2:己知mta,*pa=&a;输岀指针pa十进制的地址值的方法是( )。A・cout«pa; E・cout«*pa;C.cout«&pa; D・cout«long(&pa);答案:D分析:插入符输出指针类型对彖的地址值时,默认为十六进制形式。如果要输出十进制形式的地址值,必须用类型long进行强制。答案A,输出了指针pa本身的值,也即变量a的地址值,不能选A。答案E中输出了指针pa所指向的对象,即变量a的值,不能选E。答案C,以十六进制形式输出指针pa的地址值,也不能选。例题3:关于read()函数的下列描述中,( )是对的。A.函数只能从键盘输入中获取字符串B.函数所获取的字符多少是不受限制的C.该函数只能用于文本文件的操作中D.该函数只能按规定读取所指定的字符数答案:D分析:wad成员函数的使用格式是:read(char*buf.mtsize);其中,buf用来存放读取到的字符指针或字符数组,size用来指定从输出流中读取字符的个数°wad函数不仅可以从键盘输入中读取字符,也可以从任意输入流中获取信息,因此答案A错误。wad函数读取的字符数受到size参数的限制,答案E错误。“ad函数不仅可以用于文本文件,也可以用于二进制文件,答案C错误。例题4:某个类的输入、输出重载操作符》和<<应定义为类的成员函数,描述正确吗?答案:错误。分析:由于重载插入符和提取符时,其左操作数是流,右操作数是类的对象,因此,插入符和提取符只能重载为友元函数。例题5:卞面程序建立了类triangle,用来存储直角三角形的宽与高。这个类的重载输出运算符函数在屏幕上显示三角形。程序:^include<iostream.h>classtriangle{ intheight,base;public:triangle(mth.iiitb){height=h;base=b;}fiiendostieam&operator«(ostream&stream.tiiaiigleob);};ostreain&operator«(ostieain&stieamjnangleob){inti=j=ob.base-l;fbr(h=ob.height-1;h;h~){for(k=i;k;k-)streain«,:{ fbi(k=j-i;k;k~)stream«'stwamvv侮;ji一;stream«endl;for(k=0;k<ob.base;k-H-)stieam«,*r;stream«endl;returnstream;}voidmain(){triangletl(5,5),t2(10J0),t3(12,12);cout«tl«endl;cout«t2«endl;cout«t3«endl;}插入符和提取符应重载为类的友元。插入符和提取符重载格式如卜-:ostreain&operator«(ostreain&s,consttype&p){ 〃操作代码returns;}istream&operator»(istreain&s、type&p){ 〃操作代码returns;}其中左操作数是对ostieam或istream对彖的引用,右操作数接收将被输出或输入的对象。对重载的插入符或提取符的调用形式如卞:ostreain«obj;istream»obj;分析:不清楚插入符和提取符应重载为类的友元。重载插入符和提取符格式错误。不清楚如何用重载后的插入符与提取符进行输入/输出。例题6:从输入流中分析出数字串。例如:设输入串为A012BCD378274D<CR>EF55GAZ<CR>则输出为:Digitstimg1is:012Digitstimg2is:378Digitstimg3is:274Digitstirng4is:55答案:#include<iostreain.h>#include<ctype.h>boolgetnum(chai-*);voidmain(){mti=l;chai-buf{100];while(getnum(buf)){cout«MDigitstimgn«i«His:H;cout«buf«endl:}}boolgetnum(chai-*s){boolfbund(false);chaich;wliile(cin.get(ch)&&!isdigit(ch));if(!cin)returnfalse;do{*s++=ch;}while(ciii.get(ch)&&isdigit(ch));乜="\0:fbund=tnie;if(cin)cin.putback(ch);returnfound;}例题7:定义一个Dog类,包含体重和年龄两个数据成员及相应的成员函数。声明一个实例dogl,体重为5,年龄为10,使用PO流把dogl的状态写入磁盘文件;再声明另一个实例dog2,通过读文件把dog1的状态赋给dog2。答案:#include<fstieam.h>classDog{public:Dog(intw.iiita):weight(w),age(a){}〜Dog(){}iiitGetWeightQ{returnweight;}iiitGetAgeQ{returnage;}voidSetWeight(iiitw){weight=w;}voidSetAge(inta){age=a;}private:intagejveight;};mt{chaifileName[80];cout«HPleasemputthefilename:ciii»fileName;ofstieamfbut(fileName);if(!fbut){cout«HCairtopenthefileH«fileName«Mforwiiting.M«endl;retuni(l);}Dogdog1(5,10);fbut.write((char*)&dog1,sizeof(dog1));fbut.closeQ;lfstieamfiii(fileNaine);{cout«”CadtopenthefileM«fileName«Mforieading.n«endl;retuni(l);}Dogdog2(0,0);fin.read((char*)&dog2,sizeof(dog2));fiii.closeQ;cout«MDog2*sweight:H«dog2.GetWeightQ«endl:cout«,,Dog2,sage: H«dog2.GetAge()«endl;return0;}8.3教材习题解答当使用ifstream流类定义一个对彖并打开一个磁盘文件时,文件的隐含打开方式是什么?答:Ifstieammyfile;MvfileopenCfilename^);Open函数由两个参数组成,第一个参数是指定的文件路径名,第二个参数是打开模式,系统默认按ios::m方式打开,即为隐含打开方式。当使用ofswam流类定义一个对彖并打开一个磁盘文件时,文件的隐含打开方式是什么?答:当用输出文件流对彖调用open。成员函数打开一个文件时,打开方式参数也可以省略,即使用户指定了其他的打开方式,系统仍按默认的ios::out方式打开当使用fstreain流类定义一个对彖并打开一个磁盘文件时,文件的隐含打开方式是什么?答:文件流类lfstreain定义的对彖实际上是一个输入文件;输出文件流类ofstieam,文件流类ofstream定义的对象实际上是一个输出文件;输入输出(双向)文件流类fstreain,文件流类fstieam定义的对象实际上是一个既可读又可写的文件。所以当使用fstreain流类定义一个对象并打开一个磁盘文件时,文件的隐含打开方式是ios::iii|ios::out若在程序文件中进行标准输入输出操作,则必须在文件开始的^include命令中使用哪一个头文件?答:#mclude<iosteain.h>若在程序文件中进行文件的输入输岀操作,则必须在文件开始的^include命令中使用哪一个头文件?答:#mclude<fstreain.h>什么是格式状态标志?答:格式状态标志是C++编译器提供的一种格式标记,有6种:1出、dght、showpoint、sho\vpos、fixed和scientifico它们作为setiosflags和resetiosflags的参数使用,其类型另枚举型。格式化输入、输出使用到的格式控制符和格式状态标志均在根基类ios类中有定义程序中有说明语句:intal;chara2;doublea3;根据下面的输出要求写出相应的cout语句。输出al、a2、&3的值,每两个值之间用5个空格间隔。;以固定长度10按左对齐方式输出变量al的值。以固定长度10按左对齐方式输出变量al的值,如果al值为正,要求输出前面的正号。以固定长度15按右对齐方式输出变量a3的值,用填充字符*填充不足部分(用浮点数的定点数表示法表示)。以固定长度15、小数点后保留3位、按左对齐方式输出变量a3的值。#include<iostream・h>VoidmainO{iiital;chara2;doublea3;Cin»al»a2»a3;Cout<<al<<v a«a3«endl;Cout<<setiosflags(ios::left)<<setw(10)«al«endl;Cout<<setiosflags(ios::left)« setiosflags (ios::showpos)«setw(10)«endl;Cout«setiosflags(ios::right)«setiosflags(ios::ios::fixed)<<setfill( )«setw(15)<<a3«endl;Cout«setiosflags(ios::left)«setiosflags(ios::fixed)<<setprecision(3)«setw(15)«a3<<endl;}现在需要打开empfile文件,进行文件更新操作,应使用什么语句来实现?答:Fstreammyfile;Myfile・open("c:\\empfile",ios::out);在C++语言中,二进制文件可以用来存放哪些数据类型的数据?答:字节文件中存放的是可供机器直接读取的二进制代码,在打开方式中带有ios::binary选项。通常二进制文件的内容不能直接打印,也不允许用户直接阅读。但与字符文件相比它也有许多优点,如节省内存空间;可以存放结构类型的数据、记录等执行完函数调用indata.seekg(0,ios::end):后。函数indata.tellgO将返回什么值?答:indata.seekg(0,ios::end):表示从文件末尾开始移动0个字节,所以,indata.tellgO函数将返回该文件的末尾字节的索引值。简述几种打开文件方式ios::in、ios::out、ios::app及ios::inIios::out之间的区别。答:1)ios::in:打开的文件是输入文件,既从该文件中读取数据,用于数据输入。ios::out:打开的文件是输出文件,既该文件用于写入数据,用于数据输出。ios::in|ios::out:打开的文件既可以用于输入也可以用于输出。如何判断打开文件操作是否成功?答:fin・open(file_name,ios::in);if(fill.foil()) 〃判断open语句执行是否成功,若不成功〃用cout语句输出文件打开失败提示信息{cout«Cl\nfileopenerroron“«file_naine;exit(-1);j函数'itO的功能是什么?在程序中的作用是什么?答:函数exit()将强制程序结束执行,其格式为:exit(-l);它仅有一个整型参数,执行这条语句时,结束程序的执行,将控制权交还给操作系统,同时给出程序的结束状态通常负的参数值代表程序的非正常结束。14・函数close()实现什么操作?为什么完成对文件的操作后应及时关闭文件?答:每个文件流类中都提供有一个关闭文件的成员函数close(),当打开文件并在文件上执行完相应操作后,应将文件关闭。关闭任何一个流对彖所对应的文件,就是利用这个流对象调用close()成员函数,调用格式如下:internalfilename.close();intenialfilename是相应I/O类对象的名,closeQ成员函数没有参数。如果文件是以输出或添加方式打开的,操作系统将在close()成员函数的作用下在文件的末尾加上文件结束符,断开程序与文件间的连接;如果文件是以输入方式打开的,close()成员函数直接断开程序与文件间的连接。并能保证最后输出到文件缓冲区中的内容,无论是否已满都将立即写入到对应的文件中。当文件关闭后,文件对象不再存在,此时不能再对该文件进行任何操作。可再次使用open()函数打开文件。如果使用完文件后,没有使用close()成员函数将程序与文件断开,则当程序结束执行时,操作系统将自动关闭文件。但应养成在使用完文件后立即将其关闭的好习惯。15•顺序访问文件与随机访问文件之间的区别是什么?答:顺序访问文件是指只能按数据的存放顺序依次进行读取;随机访问文件是可以使用位移量对其中的数据进行访问,“位移量”指以当前位置(开始点或当前位置或文件末尾)为基点,移动的字节数。编写一个完整的C++程序,功能是读取一个文本文件的内容,并将文件内容以10行为单位输出到屏幕上,每输出10行就询问用户是否结束程序,不是则继续输出文件后面的内容。程序:include<lostream・h>include<stdlib・h>include<fstream・h>voidmain(){charch;//使用ch读入字符chaiy;mtj=0 //使用j统计行数(2)(2)ifsteamfile4("D:\\write2.dat“joskin|ios::nocreate);〃定义输入文件流file4并打开D盘上的wiite2.dat文件if(!file4) 〃判断文件打开操作是否成功,当file4打开失败提示有关信息{cerrvvcc\nDW\vrite2.datnotopen"«eiidl;exit(-1);}while(f4.get(ch))//依次从文件中输入字符到ch,当读到的是文件结束符时//条件表达式的值为0{cout«ch;if(ch==S)j++;〃如果是换行符,j值增加1if(j%10==0){ coutvv”是否继续显示?Y/bT;ciii>v;if(y=='y‘||y=='Y‘)continue;elsebreak:}}cout«endl«”lines:"vvj«endl;file4.close();}按下面每个题目的要求编写出相应的函数利用一个字符文件保存100以内的所有素数。利用一个字节文件保存10个100以内的随机整数,要求保存的所有值各不相同。程序:(1)mclude<lostream・h>mclude<stdlib・h>mclude<fstieam・h>voidmain(){ofstieamfilel; //定义输出文件流filelofile1.open(<CA:\\write1.dat");//调用open()成员禹数打开A盘上的writel.dat〃文件。也可舌接写为ofsteamfilel("Ai\\write1dat")if(!filel)〃判断open语句执行是否成功,当filel打开失败则提示有关信息{cen'«"\nA:W\vritel.datnotopen“«endl;exit(-1);}iiitflag=0;filel«2;for(mtk=3;k<=100;k++){Flag=l;For(int尸2;j<=k-l;j++){if(k%j=O){Aag=0;Break;;}}If(flag==l)filel«k«““;〃向filel文件流写入k值}file1.close();〃关闭file1所对应的文件}#mclude<stdlib・h>#mclude<fstieam・h>include<iostream.h>#includevconio.h〉#include<time.h>voidmain(){intx[10];srand((unsigned)time(NULL));for(inti=0;i<10;i++){x[i]=randQ;ofstreamfile5; //定义输入文件流file5file5.open(ccd:\\bbl.dat",10s::out|ios::biliary);//调用open()成员函数打开d盘上的bbl.dat二进制文件//也可直接写为ofswamfile5(c<d:\\bbl.dat,ios::out|ios::binary)if(!file5)〃判断open语句执行是否成功,当file5打开失败提示有篥信息。{cen'« d:\\bbl.datnotopen“«endl;exit(-1);}for(mtk=0;k<10;k++)〃向f5所对应的二进制文件中写入每个元素的值file5・write((char*)&x[k],sizeof(int));〃也可写为file5.write((chai*)&x[k],2)file5.close(); 〃关闭file5所对应的文件}8.4补充习题1.已知inta,*pa=&a;,输出指针pa十进制的地址值的方法是(A.cout«pa;C8.4补充习题1.已知inta,*pa=&a;,输出指针pa十进制的地址值的方法是(A.cout«pa;C・cout<<&pa;2.下列输出字符A,的方法中,错误的是A.cout«put(,A,);C・cout.putfA*);3•若己知cliaistr[20];,当输入为:Tinsisaproeram所得的结果是su=(A.Tliisisaprogram有语句cm»str;)oE・TliisC.)oD.(D.B.cout«*pa;cout«long(&pa);)oE・cout«lA,;charA=,A,;cout«A;A.ios::skipws跳过输入中的空白字符E・ios::showpos标明浮点数的小数点和后面的零C.ios::fill()读当前填充字符(缺省值为空格)D・ios::piecision()读当前浮点数精度(缺省值为6)4•在下面格式化命令的解释中,错误的是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论