《C的输入和输出》PPT课件.ppt_第1页
《C的输入和输出》PPT课件.ppt_第2页
《C的输入和输出》PPT课件.ppt_第3页
《C的输入和输出》PPT课件.ppt_第4页
《C的输入和输出》PPT课件.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1,第9章C+的输入和输出,本章主要内容9.1C+为何建立自己的输入输出系统9.2C+的流库及其基本结构9.3预定义类型的输入输出9.4用户自定义类型的输入输出9.5文件的输入输出本章重点预定义类型、用户自定义类型与文件的输入输出本章难点用户自定义类型的输入输出的格式及文件的输入输出本章所需学时:4学时,2,9.1C+为何建立自己的输入输出系统,数据的输入输出对于程序设计来说是很重要的,但在C和C+中并没有专门的输入输出语句,在C+中的I/O操作而是通过一组标准I/O函数和I/O流来实现的。C+的标准I/O函数是从C语言继承而来的,同时对C语言的标准I/O函数进行了扩充。C+的I/O流不仅拥有标准I/O函数的功能,而且比标准I/O函数功能更强、更方便、更可靠。C+的流类比C的输入输出函数具有更大的优越性:首先它是类型安全的,可以防止用户输出数据与类型不一致的错误。C+中可以重载运算符“”和“和变量cout运算符进行重载:cin.operator(变量)cout.operator(变量和常量),8,输出运算符从运算符角度来看,输出通过输出运算符“”来完成的,输出运算符“”也称插入运算符,它是一个双目运算符,有两个操作数,左操作数为。stream类的一个对象(如cout),右操作数为一个系统预定义类型的常量或变量。输出运算符“”采用左结合方式工作,并且返回它的左操作数,因此,可以把多个输出组合到一个语句中工作,使用起来很方便。在使用输出运算符“”来完成。输入运算符“”也称提取运算符,它也是一个双目运算符,有两个操作数,左面的操作数是istream类的一个对象(cin),右面的操作数是系统预定义的任何数据类型的变量。在缺省情况下,运算符“”将跳过空白符,然后读入后面的与变量类型相对应的值。当输入字符串(即类型为Char“的变量)时,运算符“”的作用是跳过空白,读入后面的非空白字符,直到遇到另一个空白字符为止,并在串尾放一个字符“0”。因此,输入字符串遇到空格时,就当作本数据输入结束。,10,数据输入时,系统除检查是否有空白外,还检查输入数据与变量的匹配情况。在缺省情况下,运算符“”将跳过空白符,因此,对一组变量输入值时可用空格或换行将数值之间隔开。输入输出格式控制在C+提供了两种进行格式控制的方法:使用ios类中有关格式控制的成员函数;操纵符的特殊类型的函数,11,使用ios类中的成员函数进行输入输出格式控制时,由通过对格式状态字、域宽、填充字符以及输出精度的操作完成。输入输出格式是由一个longint类型的状态自来决定。在ios类的public部分定义了一个枚举,它的每个成员分别定义状态标志字的一个位,每一位都称为一个状态标志位。这个枚举定义如下:public:enumskipws=0 x0001,/跳过输入空格left=0 x0002,/输出左对齐right=0 x0004,/输出右对齐internal=0 x0008,/符号和进制指示符后的填补dec=0 x0010,/十进制转换oct=0 x0020,/八进制转换hex=0 x0040,/十六进制转换,12,showbase=0 x0080,/输出时显示进制指示符showpoint=0 x0100,/显示十进制小数点uppercase=0 x0200,/大写十六进制输出showpos=0 x0400,/正整数前显示“+”scientific=0 x0800,/科学计数表示法表示浮点数fixed=0 x1000,/小数形式标识符点数unitbuf=0 x2000,/在插入后刷新所有流stdio=0 x4000/刷新stdout,;,13,设置状态标志,即是将某一状态标志“1”,可使用setf()函数其一般格式为:longios:setf(longflags)其调用格式为:流对象.setf(ios:状态标志)消除状态标志,即是将某一个状态标志“0”,可使用unsetf()函数其一般格式为:longios:unsetf(longflags)其调用格式为:流对象.unsetf(ios:状态标志)取状态标志,可使用flags()函数,有两种情况:longios:flags(longflag)longios:flags()前者将状态标志字设置为flag,并返回设置前的状态标志字;但与setf()函数的区别在于:setf()函数是原有的基础上追加设定,而flags()函数是用新设定来覆盖以前的状态标志字。后者用于返回当前的状态标志字。,14,例9-2来说明几个函数的用法#includevoidshowflags(longf)longi;for(i=0 x8000;i;i=i1)if(i,15,设置域宽,主要是用来控制输出。设置域宽的成员函数有两个:intios:width();intios:width(intw)前者用来返回当前的域宽值;后者用来设置域宽,并返回原来的域宽。注意,所设置的域宽仅对下一个流输出操作有效,当一次输出操作完成之后,域宽又恢复为0。填充字符,填充字符有两个成员函数:intios:fill();intios:fill(charch)前者用来返回当前的填充字符,后者用ch重新设置填充字符,并返回设置前的填充字符设置显示的精度intios:precision(intp);此函数用来重新设置浮点数所需小数的位数,并返回设置前的小数点后的位数例9-3来说明几个函数的用法,16,#includemain()coutx_width=cout.width()endl;coutx_fill=cout.fill()endl;coutx_precision=cout.precision()endl;cout123123.45678234.567endl;cout-endl;cout*x_width=10,x_fill=,x_precision=4*n;cout.width(10);cout.precision(4);cout123123.45678234.567endl;coutx_width=cout.width()endl;coutx_fill=cout.fill()endl;coutx_precision=cout.precision()endl;cout-endl;cout*x_width=10,x_fill=,17,cout123123.45678endl;cout.setf(ios:left);cout.width(10);cout123123.45678endl;coutx_width=cout.width()endl;coutx_fill=cout.fill()endl;coutx_precision=cout.precision()endl;return0;,18,使用预定义的操作符进行I/O格式控制使用ios类中的成员函数进行I/O格式控制时,每个函数的调用需要写一条语句,而且不能将它们直接嵌入到I/O语句中去,显然使用起来不太方便。C+提供了另一种进行I/O格式控制的方法,这一方法使用了一种称为操作符的特殊函数。操纵符分为无参操纵符和带参操纵符,C+预定义的操纵符见表9.1。表9.2列出了常用带参操纵符。所有不带形参的操作符都定义在头文件iostream.h中,而带形参的操作符则定义在头文件iomaniph中,因而使用相应的操作符就必须包含相应的头文件。,19,表9.1常用无参操纵符,20,表9.2常用带参操纵符,21,例9-4操作符的使用例子#include#includemain()coutsetw(10)123546endl;cout123setiosflags(ios:scientific)setw(20)123.456789endl;cout123setw(10)hex123endl;cout123setw(10)oct123endl;cout123setw(10)dec123endl;coutresetiosflags(ios:scientific)setprecision(4)123.456789endl;coutsetiosflags(ios:left)”来实现。对于任何给定的用户定义类型T,定义一个operator函数用于输出T类型的对象。运算符“”可以重载,由用户定义如何输入自定义的类对象。在重载提取运算符时,同样应将其重载为类的友元,而不是成员。对于任何给定的用户定义类型T,定义一个operator函数,用于从指定的输入流读取T类型的对象。输入运算符重载与输出运算符大体相同,只将osteam换为istream,把“”代替即可。,28,9.5文件的输入输出,在C+程序中使用的保存数据的文件按存储格式分为两种类型,一种为字符格式文件,简称字符文件,另一种为内部格式文件,简称字节文件。字符文件又称ASCII码文件或文本文件,字节文件又称二进制文件。在字符文件中,每个字节单元的内容为字符的ASCII码,被读出后能够直接送到显示器或打印机上显示或打印出对应的字符,供人们直接阅读。在字节文件中,文件内容是数据的内部表示,是从内存中直接复制过来的。当然对于字符信息,数据的内部表示就是ASCII码表示,所以在字符文件和在字节文件中保存的字符信息没有差别,但对于数值信息,数据的内部表示和ASCII码表示截然不同,所以在字符文件和在字节文件中保存的数值信息也截然不同。,29,C+文件是一个字符流或二进制流,它把数据看作是一连串的字符,而不考虑记录的界限,它对文件的存取以字符为单位进行,将这种文件称为流式文件在C+中,要进行文件的输入输出,必须先创建一个流,然后将这个流与文件相关联,即打开文件,此时才能进行读写操作,完成之后在关闭这个文件。,30,文件的打开与关闭流可以分为3类:输入流、输出流以及输入/输出流,相应地文件流也有三个文件流:ifstream、ofstream以及fstream这些文件流都定义在fstream.h文件中:要执行文件的输入输出,需要做3件事情:在程序中包含头文件fstream.h。建立流,建立流的过程就是定义流类的对象。例如ifstreamin;/说明一个输入流对象inofstreamout;/说明一个输出流对象outfstreamboth;/说明一个输入/输出流对象both使用open()函数打开文件,也就是使某一个文件与上面的某一流向联系。Open函数是上述3个流类的成员函数,其函数原型在fstream.h中定义的,其原型为:,31,voidopen(constchar*filename,intmode,intaccess=filebuf:openprot)其中,filename是文件名字,它可包含路径说明。mode说明文件打开的模式,它对文件的操作影响重大,mode的取值必须是以下值之一:ios:in打开文件进行读操作ios:out打开文件进行写操作ios:ate打开时文件指针定位到文件尾ios:app添加模式,所有增加都在文件尾部进行ios:trunc如果文件已存在则清空原文件ios:nocreate如果文件不存在则打开失败ios:noreplace如果文件存在则打开失败ios:binary二进制文件(非文本文件),32,下面对这些值作进一步说明如果希望向文件尾部添加数据,则应当用“ios:app”方式打开文件,但此时文件必须存在。打开时,文件位置指针移到文件尾部。用这种方式打开的文件只能用于输出。用“ios:ate”方式打开一个已存在的文件时,文件位置指针自动移到文件的尾部。用“ios:in”方式打开的文件只能用于输入数据,而且该文件必须已经存在。如果用类ifstream来产生一个流,则隐含为输入流,不必再说明使用方式。用“ios:out”方式打开文件,表示可以向该文件输出数据。如果用类ofstream来产生一个流,则隐含为输出流,不必再说明使用方式。,33,通常,当用open()函数打开文件时,如果文件存在,则打开该文件,否则建立该文件。但当用“ios:nocreate”方式打开文件时,表示不建立新文件,在这种情况下,如果要打开的文件不存在,则函数open()调用失败。相反,如果使用“ios:noreplace”方式打开文件。则表示不修改原来文件,而是要建立新文件。因此,如果文件已经存在,则open()函数调用失败。当使用“ios:trunc”方式打开文件时,如果文件已存在,则清除该文件的内容,文件长度被压缩为0。实际上,如果指定“ios:out”方式,且未指定“ios:ate”方式或“ios:app”方式,则隐含为“ios:trunc”方式。如果使用“ios:binary”方式,则以二进制方式打开文件,缺省时,所有的文件以文本方式打开。在用文本文件向计算机输入时,把回车和换行两个字符转换为一个换行符,而在输出时把换行符转换为回车和换行两个字符。对于二进制文件则不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。,34,对于ifstream流,mode的默认值为ios:in;对于ofstream流,mode的默认值为ios:out。access决定文件的访问方式,取值为:0普通文件1只读文件2隐含文件4系统文件一般情况下,该访问方式使用默认值为filebuf:penprot。与其他状态标志一样,mode的符号常量可以用位或运算“|”组合在一起,如ios:in|ios:binary表示以只读方式打开二进制文件。文件的关闭:out.close():将关闭与流out相联接的文件。,35,文件的读写文本文件只适用于那些解释为ASCII码的文件。处理文本文件时将自动作一些字符转换,如输出换行字符0 x0A时将转换为回车0 x0D与换行0 x0A两个字符存入文本文件,读入时也会将回车与换行两个字符合并为一个换行字符,这样内存中的字符与写入文件中的字符之间就不再是一一对应关系。文本文件的结束以ASCII码的控制字符0 x1A表示。一旦文件打开,从文件中读出数据与向文件中写入数据都十分容易,只需要使运算符“”就可以了,但不必须用与文件相关联的流代替cin和cout。例9-9给出将数据写入文件test中。,36,#includevoidmain()ofstreamfout(“test”);if(!fout)cout“Cannotopenoutputfilen”;return1;fout10“123.456i;coutstriendl;fin.close();return0;,38,二进制文件的读写二进制文件不同于文本文件,它可用于任何类型的文件(包括文本文件),读写二进制文件的字符不作任何转换,读写的字符与文件之间是完全一致的。一般地,对二进制文件的读写可采用两种方法:一种是使用get()和put();另一种是使用read()和write()。1.get()与put()函数的一般格式:istreaminti;charc=a;for(i=0;i26;i+)fs.put(c);c+;voidtest_read()ifstreamfs(d:test.dat);charc;while(fs.get(c)coutc;voidmain()test_write();test_read();,40,例9.12与9.13给出了write()函数与read()函数的使用情况#include#include#includemain()ofstreamout(test2);if(!out)coutCannotopenoutputfilen;return1;inti=12340;doublenum=100.45;out.write(char*),41,#include#include#includemain()ofstreamin(test2);if(!in)coutCannotopenoutputfilen;re

温馨提示

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

评论

0/150

提交评论