《C程序设计》电子教案第10章流类库与输入输出.ppt

上传人:max****ui 文档编号:11498688 上传时间:2020-04-26 格式:PPT 页数:59 大小:371KB
返回 下载 相关 举报
《C程序设计》电子教案第10章流类库与输入输出.ppt_第1页
第1页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第2页
第2页 / 共59页
《C程序设计》电子教案第10章流类库与输入输出.ppt_第3页
第3页 / 共59页
点击查看更多>>
资源描述
第10章流类库与输入输出,10.1I/O标准流类10.2格式化I/O10.3文件流10.4字符串流,10.1I/O标准流类,10.1.1预定义流10.1.2C+中的流类库,返回首页,在C+语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这三个方面。对标准输入设备和标准输出设备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为串I/O。,C+中把数据之间的传输操作称作流。在C+中,流既可以表示数据从内存传送到某个载体或设备中,即输出流;也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。在进行I/O操作时,首先打开操作,使流和文件发生联系,建立联系后的文件才允许数据流入或流出,输入或输出结束后,使用关闭操作使文件与流断开联系。,C+中所有流都是相同的,但文件可以不同。使用流以后,程序用流统一对各种计算机设备和文件进行操作,使程序与设备、程序与文件无关,从而提高了程序设计的通用性和灵活性。也就是说,无论与流相联系的实际物理设备差别有多大,流都采用相同的方式运行。这种机制使得流可以跨越物理设备平台,实现流的透明运作,而与实际的物理设备无关。例如,往显示器上输出字符和向磁盘文件或打印机输出字符,尽管接受输出的物理设备不同,但具体操作过程是相同的。,10.1.1预定义流,1cout在ostream输出流类中定义有对左移操作符重载的一组公用成员函数,函数的具体声明格式为:istream,3cerrcerr类似标准错误文件。cerr与cout的差别在于:(1)cerr不能重定向。(2)cerr不能被缓冲,它的输出总是直接传达到标准输出设备上。4clogclog是不能重定向的,但是可以被缓冲。在某些系统中,由于缓冲,使用clog代替cerr可以改进显示速度。clogErrorn;,返回本节,10.1.2C+中的流类库,C+语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream和strstream等。其中ios为根基类,它直接派生四个类:输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase,输入文件流类ifstream同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类ofstream同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流类ostrstream同时继承了输出流类和字符串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类。,返回本节,10.2格式化I/O,10.2.1ios类中的枚举常量10.2.2使用ios成员函数10.2.3使用I/O操作符10.2.4检测流操作的错误,返回首页,10.2.1ios类中的枚举常量,在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios:前缀后都可以为本类成员函数和所有外部函数访问。在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。该枚举类型定义如下:enumskipws,left,right,internal,dec,oct,hex,showbase,showpoint,uppercase,showpos,scientific,fixed,unitbuf,stdio;,各枚举常量的含义如下:(1)skipws。(2)left,right,internal。(3)dec,oct,hex。(4)showbase。(5)showpoint。(6)uppercase。(7)showpos。(8)scientific,fixed。(9)unitbuf,stdio。,返回本节,10.2.2使用ios成员函数,ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下:intbad();/操作出错时返回非0值inteof();/读取到流中最后的文件结束符时返回非0值intfail();/操作失败时返回非0值voidclear();/清除bad,eof和fail所对应的标志状态,使之恢复为正常状态/值0,使good标志状态恢复为1charfill();/返回当前使用的填充字符charfill(charc);/重新设置流中用于输出数据的填充字符为c的值,返回/此前的填充字符。系统预设置填充字符为空格longflags();/返回当前用于I/O控制的格式状态字,longflags(longf);/重新设置格式状态字为f的值,返回此前的格式状态字intgood();/操作正常时返回非0值,当操作出错、失败和读到文件/结束符时均为不正常,则返回0intprecision();/返回浮点数输出精度,即输出的有效数字的位数intprecision(intn);/设置浮点数的输出精度为n,返回此前的输出精度。系统预设/置的输出精度为6,即输出的浮点数最多具有6位为有效数字intrdstate();/操作正常时返回0,否则返回非0值,它与good()正好相反longsetf(longf);/根据参数f设置相应的格式化标志,返回此前的设置。该参数/f所对应的实参为无名枚举类型中的枚举常量(又称格式化常/量),可以同时使用一个或多个常量,每两个常量之间要用按位或/操作符连接。如需要左对齐输出,并使数值中的字母大写时,/则调用该函数的实参为ios:left|ios:uppercase,longunsetf(longf);/根据参数f清除相应的格式化标志,返回此前的设置。如要/清除此前的左对齐输出设置,恢复默认的右对齐输出设置,/则调用该函数的实参为ios:leftintwidth();/返回当前的输出域宽。若返回数值0则表明没为刚才输出的数/值设置输出域宽。输出域宽是指输出的值在流中所占有的字节数intwidth(intw);/设置下一个数据值的输出域宽为w,返回为输出上一个数据值/所规定的域宽,若无规定则返回0。注意:此设置不是一直有/效,而只是对下一个输出数据有效,例10-2:给出以下程序的运行结果。#includevoidmain()intx=123;doubley=-3.456789;coutx=;cout.width(10);/设置输出下一个数据的域宽为10coutx;/按默认的右对齐输出,剩余位置填充空格字符couty=;cout.width(10);/设置输出下一个数据的域宽为10coutyendl;cout.setf(ios:left);/设置按左对齐输出,coutx=;cout.width(10);coutx;couty=;cout.width(10);coutyendl;cout.fill(*);/设置填充字符为*cout.precision(3);/设置浮点数输出精度为3cout.setf(ios:showpos);/设置正数的正号输出coutx=;cout.width(10);coutx;couty=;cout.width(10);coutyendl;,此程序运行结果如下:x=123y=-3.45679x=123y=-3.45679x=+123*y=-3.46*,例10-3:给出以下程序的运行结果。#includevoidmain()floatx=12,y=-3.456;coutxyendl;cout.setf(ios:showpoint);/强制显示小数点和无效0coutxyendl;cout.unsetf(ios:showpoint);/恢复默认输出cout.setf(ios:scientific);/设置按科学表示法输出coutxyendl;cout.setf(ios:fixed);/设置按定点表示法输出coutxy)的输出对象即可。,例10-4:给出以下程序的运行结果。#include/因iomanip.h中包含有iostream.h,所以该命令可省略#includevoidmain()intx=12,y=345,z=6789;coutxyzendl;/按十进制输出coutoctxyzendl;/按八进制输出couthexxyzendl;/按十六进制输出coutsetiosflags(ios:showbase|ios:uppercase);/设置基指示符和数值中的字母大写输出coutxyzendl;/仍按十六进制输出coutresetiosflags(ios:showbase|ios:uppercase);/取消基指示符和数值中的字母大写输出coutxyzendl;/仍按十六进制输出coutdecxyzendl;/按十进制输出,例10-5:给出以下程序的运行结果。#include#includevoidmain()intx=123;doubley=-3.456789;coutx=setw(10)x;couty=setw(10)yendl;coutsetiosflags(ios:left);/设置按左对齐输出coutx=setw(10)x;couty=setw(10)yendl;,coutsetfill(*);/设置填充字符为*coutsetprecision(3);/设置浮点数输出精度为3coutsetiosflags(ios:showpos);/设置正数的正号输出coutx=setw(10)x;couty=setw(10)yendl;coutresetiosflags(ios:left|ios:showpos);coutsetfill();,返回本节,10.2.4检测流操作的错误,在I/O流的操作过程中可能出现各种错误,每一个流都有一个状态标志字,以指示是否发生了错误以及出现了哪种类型的错误,这种处理技术与格式控制标志字是相同的。ios类定义了以下枚举类型:enumio_stategoodbit=0 x00,/不设置任何位,一切正常eofbit=0 x01,/输入流已经结束,无字符可读入failbit=0 x02,/上次读/写操作失败,但流仍可使用badbit=0 x04,/试图作无效的读/写操作,流不再可用hardfail=0 x80/不可恢复的严重错误;,返回本节,10.3文件流,10.3.1文件的概念10.3.2文件的打开与关闭10.3.3文件的读写,返回首页,10.3.1文件的概念,在磁盘上保存的信息是按文件的形式组织的,每个文件都对应一个文件名,并且属于某个物理盘或逻辑盘的目录层次结构中一个确定的目录之下。一个文件名由文件主名和扩展名两部分组成,它们之间用圆点(即小数点)分开,扩展名可以省略,当省略时也要省略掉前面的圆点。文件主名是由用户命名的一个有效的C+标识符,为了同其他软件系统兼容,一般让文件主名为不超过8个有效字符的标识符,同时为了便于记忆和使用,最好使文件主名的含义与所存的文件内容相一致。,在C+程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称ASCII码文件或文本文件,字节文件又称二进制文件。,C+程序文件,利用其他各种语言编写的程序文件,用户建立的各种文本文件,各种软件系统中的帮助文件等,因都是ASCII码文件,所以都可以在C+中作为字符文件使用。C+系统把各种外部设备也看作为相应的文件。如把标准输入设备键盘和标准输出设备显示器看作为标准输入输出文件,其文件名(又称设备名)为con,当向它输出信息时就是输出到显示器,当从它输入信息时就是从键盘输入。,返回本节,10.3.2文件的打开与关闭,流可以分为3类:输入流、输出流以及输入/输出流,相应地必须将流说明为ifstream、ofstream以及fstream类的对象。例如:ifstreamifile;/说明一个输入流ofstreamofile;/说明一个输出流fstreamiofile;/说明一个输入/输出流,说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接。open()的函数原型为:voidopen(constchar*filename,intmode,intprot=filebuf:openprot);,ios:in打开文件进行读操作ios:out打开文件进行写操作ios:ate打开时文件指针定位到文件尾ios:app添加模式,所有增加都在文件尾部进行ios:trunc如果文件已存在则清空原文件ios:nocreate如果文件不存在则打开失败ios:noreplace如果文件存在则打开失败ios:binary二进制文件(非文本文件),下面对文件的打开方式作几点说明:(1)文件的打开方式可以为上述的一个枚举常量,也可以为多个枚举常量构成的按位或表达式。(2)使用open成员函数打开一个文件时,若由字符指针参数所指定的文件不存在,则建立该文件。(3)当打开方式中不含有ios:ate或ios:app选项时,则文件指针被自动移到文件的开始位置,即字节地址为0的位置。(4)当用输入文件流对象调用open成员函数打开一个文件时,打开方式参数可以省略,默认按ios:in方式打开,若打开方式参数中不含有ios:in选项时,则会自动被加上。,下面给出定义文件流对象和打开文件的一些例子:(1)ofstreamfout;fout.open(a:aaa.dat);/字符串中的双反斜线表示一个反斜线(2)ifstreamfin;fin.open(a:bbb.dat,ios:in|ios:nocreate);(3)ofstreamofs;ofs.open(a:ccc.dat,ios:app);(4)fstreamfio;fio.open(a:ddd.ran,ios:in|ios:out|ios:binary);,返回本节,10.3.3文件的读写,1文件读写方法(1)使用流运算符直接读写。(2)使用流成员函数。常用的输出流成员函数如下:put函数write函数get函数read函数getline函数,下面对文件的打开方式作几点说明:(1)向字符文件输出数据有两种方法,一种是调用从ostream流类中继承来的插入操作符重载函数,另一种是调用从ostream流类中继承来的put成员函数。(2)从打开的字符文件中输入数据到内存变量有三种方法。(3)当使用流对象调用get()成员函数时,通过判断返回值是否等于文件结束符EOF可知文件中的数据是否被输入完毕。,2文本文件的读写文本文件只适用于那些解释为ASCII码的文件。处理文本文件时将自动作一些字符转换,如输出换行字符0 x0A时将转换为回车0 x0D与换行0 x0A两个字符存入文本文件,读入时也会将回车与换行两个字符合并为一个换行字符,这样内存中的字符与写入文件中的字符之间就不再是一一对应关系。文本文件的结束以ASCII码的控制字符0 x1A表示。,例10-7:向a盘上的write1.dat文件输出010之间的整数,含0和10在内。#include#include#includevoidmain(void)ofstreamf1(a:/write1.dat);/定义输出文件流,并打开相应文件,若打开/失败则f1带回0值if(!f1)/当f1打开失败时进行错误处理cerra:/write1.datfilenotopen!endl;exit(1);for(inti=0;i10;i+)f1i;/向f1文件流输出i值f1.close();/关闭f1所对应的文件,例10-9:假定一个结构数组a中的元素类型pupil包含有表示姓名的字符指针域name和表示成绩的整数域grade,试编写一个函数把该数组中的n个元素输出到字符文件“a:/write3.dat”中。#include#includevoidArrayOut(pupila,intn)ofstreamf3(a:/write3.dat);if(!file3)/当file3打开失败时进行错误处理cerrFileofa:/write3.datnotopen!endl;exit(1);,for(inti=0;in;i+)file3ai.nameendlai.gradeendl;file3.close();若已经为输出pupil类型的数据定义了如下插入操作符重载函数:ostream”。,例10-10:从例10-7所建立的a:/write1.dat文件中输入全部数据并依次显示到屏幕上。#include#include#includevoidmain(void)ifstreamf1(a:/write1.dat,ios:in|ios:nocreate);/定义输入文件流,并打开相应文件,若打开失败则file1带回0值if(!file1)/当file1打开失败时进行错误处理cerra:/write1.datfilenotopen!x)/依次从文件中输入整数到x,当读到的是文件结束符时条件表达式/的值为0coutx;coutpos;if(posmaxpos)coutThepositionoffileisntrightendl;,elsecharch;ifile.seekg(pos);ifile.get(ch);coutchendl;ifile.close();return1;如果需要读取多个字节的数据,则可将ifile.get(ch);改为:ifile.read(char*),返回本节,10.4字符串流,10.4.1字符串流概述10.4.2istrstream类的构造函数10.4.3ostrstream类的构造函数,返回首页,10.4.1字符串流概述,字符串流类包括输入字符串流类istrstream,输出字符串流类ostrstream和输入输出字符串流类strstream三种。它们都被定义在系统头文件strstrea.h中。只要在程序中带有该头文件,就可以使用任一种字符串流类定义字符串流对象。每个字符串流对象简称为字符串流。字符串流对应的访问空间是内存中由用户定义的字符数组,而文件流对应的访问空间是外存上由文件名确定的文件存储空间。,三种字符串流类的构造函数声明格式分别如下:istrstream(constchar*buffer);ostrstream(char*buffer,intn);strstream(char*buffer,intn,intmode);,下面给出定义相应字符串流的例子。(1)ostrstreamsout(a1,50);(2)istrstreamsin(a2);(3)strstreamsio(a3,sizeof(a3),ios:in|ios:out);,返回本节,10.4.2istrstream类的构造函数,istrstream类的构造函数的原型分别是:istrstream:istrstream(char*s);istrstream:istrstream(char*s,intn);这两个构造函数的第一个参数s是一个字符指针或字符数组,使用该串来初始化要创建的流对象。第一个构造函数是使用所指定的串的全部内容来构造流对象,而第二个构造函数使用串中前n个字符来构造串对象。,下面举例说明上述构造函数的用法。例10-14:从一个字符串流中输入用逗号分开的每一个整数并显示出来。#includevoidmain()chara=12,34,56,78,90,87,65,43;coutawsxws;/从流中读入一个整数,并使用操作符ws读取/一个整数前后的空白字符coutx;/输出x的值并后跟一个空格sin.get(ch);/从sin流中读入一个字符,实际读取的是,或字符couti;istrstreams2(buf,3);s2j;couti+j=48/从sin流中读入下一个字符,soutends;/向sout流输出作为结束符的字符和一个字符串结束符0coutb;/输出字符串流sout对应的字符串coutendl;该程序的运行结果如下:ab12+34,56*78-90/cd123,ABC45DE:fg67;891234567890123456789,返回本节,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!