C程序设计《输入输出流》.ppt

上传人:tia****nde 文档编号:14142077 上传时间:2020-07-06 格式:PPT 页数:57 大小:914.50KB
返回 下载 相关 举报
C程序设计《输入输出流》.ppt_第1页
第1页 / 共57页
C程序设计《输入输出流》.ppt_第2页
第2页 / 共57页
C程序设计《输入输出流》.ppt_第3页
第3页 / 共57页
点击查看更多>>
资源描述
C+程序设计,输入输出流,第9章输入输出流,本章学习要点,完成程序的基本功能需要有初始数据的输入和运行结果的输出. 本章重点介绍C+输入/输出流库、预定义类型数据的输入和输出、格式控制、自定义类型数据的输入和输出以及文件的输入和输出等内容。,9.1 C+的输入和输出概述 9.2 C+的标准输入/输出流 9.3 输入运算符和输出运算符及其重载 9.4 C+格式输入和输出 9.5 文件操作与文件流 9.6 学生信息管理系统中的文件操作,第9章输入输出流,9.1 C+的输入和输出概述,1iostream类库中有关的类 C+除保留C语言的输入输出系统之外,还利用继承的机制创建出一套自己的方便、一致、安全、可扩充的输入输出系统,这套输入输出系统就是C+的输入/输出(I/O)流库。 C+自有的输入输出通过编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。而且C+的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C+对标准类型的数据和对用户自定义类型的数据的输入/输出,采用同样的方法处理。C+通过I/O流类库来实现丰富的I/O功能。 C+的输入输出优于C语言中的printf()和scanf(),但是相对来说比较复杂,要掌握许多细节。,9.2 C+的标准输入/输出流,C+的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。,C+的I/O流库中的类称为流类。用流类定义的对象称为流对象。前面曾提到:cout和cin并不是C+语言中提供的语句,它们是I/O流类的对象。在未学习类和对象时,在不致引起误解的前提下,为叙述方便,把它们称为cout语句和cin语句。在学习了类和对象后,我们对C+的输入输出应当有更深刻的认识。,9.2.1 iostream类库中有关的类及其定义的流对象C+编译系统提供了用于输入输出的iostream类库。在iostream类库中包含许多用于输入输出的类。这些类的继承层次结构如课本291页图9-1所示。,为了实现C+对文件的操作,C+的iostream类库中派生定义了用于文件操作的类,它们分别是如下几个类: fstreambase类:这是一个公共基类,文件操作中不直接使用这个类。 ifstream类:派生自fstreambase类和istream类,负责对文件进行提取操作。 ofstream类:派生自fstreambase类和ostream类,负责对文件进行插入操作。 fstream类:派生自fstreambase类和iostream类,负责对文件进行插入和提取操作。,iostream类库中不同的类的声明被放在不同的头文件中,见课本292页表9-1。用户在程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。 我们编程时常用的头文件有: iostream:包含了对输入输出流进行操作所需的基本信息。 fstream:用于用户管理的文件的I/O操作。 strstream:用于字符串的I/O。 stdiostream:用于混合使用C和C+的I/O机制时。 iomanip:用于格式化I/O时。,2在iostream头文件中定义的流对象 在iostream头文件中定义的类有:ios,istream,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign等。,iostream头文件包含了对输入输出流进行操作所需的基本信息。因此大多数C+程序都包括iostream头文件。在iostream头文件中不仅定义了有关的类,还定义了4种流对象,供用户使用,它们是: cin:是istream的派生类istream_withassign的对象,它是从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。 cout:是ostream的派生类ostream_withassign的对象,它是从内存输入到标准输出设备(显示器) 的数据流,称为cout流或标准输出流。 cerr和clog:作用相似,均为向输出设备(显示器)输出出错信息。它们的区别是cerr提供不带缓冲区的输出,clog提供带缓冲区的输出。 从键盘输入时用cin流,向显示器输出时用cout流。向显示器输出出错信息时用cerr或clog流。,9.2.2 C+的标准输出流标准输出流是流向标准输出设备(显示器)的数据。ostream类定义了3个输出流对象,即cout,cerr,clog。 1cout,cerr和clog流 (1)cout流对象 cout必须和运算符一起使用。用cout进行输出的一般形式为: cout输出项1输出项2.; 它的功能是将输出项1,输出项2,.插入到输出流cout中,然后由C+系统将cout中的内容输出到显示屏幕上。 在C+的头文件iostream中,定义了一个代表回车换行的控制符endl,其作用与“n”相同。如下列三个输出语句是等价的:coutC+ Programn; coutC+ Program n; coutC+ Programendl;,而且需要注意的是: 系统已经对“”运算符用于标准类型数据的输入输出进行了重载,但未对用户自定义类型数据的输入输出进行重载。 在用cout进行输出时,每输出一项都要用一个“”运算符。例如:输出语句:couta=a,b=bendl; 不能写成: couta=, a, , b=, bendl;,(2)cerr流对象 cerr流对象是标准出错流,它的作用是向输出设备输出出错信息。cerr与标准输出流cout的作用和用法类似。但不同的是:cout流通常是传送到显示器输出,但也可以被重定向输出到磁盘文件,而cerr流中的信息只能在显示器输出。当调试程序时,如果不希望程序运行时的出错信息被送到其他文件,这时应该用cerr。例题见课本294页【例9-1】,(3)clog流对象 clog流对象也是标准出错流,它的作用和cerr相同,都是在终端显示器上显示出错信息。只不过cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时才向显示器输出。,2用流成员函数put()输出字符 ostream类的成员函数put()提供了一种将单个字符送进输出流的方法。其使用方法如下: char a=m; cout.put(a); /会输出显示字符m cout.put(m); /会输出和上一句相同的结果 另外,put()函数的参数还可以是字符的ASCII代码或者一个整型表达式。如: cout.put(65+32); 也显示字符a,因为97是字符a的ASCII代码。,我们可以在一个语句中连续调用put()函数。如: cout.put(71).put(79).put(79).put(68).put(n); 在屏幕上显示GOOD。 还可以用putchar()函数输出一个字符。putchar()函数是C语言中使用的,在stdio.h头文件中定义。C+保留了这个函数,在iostream头文件中定义。,3用流成员函数write()输出字符 ostream类的成员函数write()是一种将字符串送到输出流的方法。其使用格式为: cout.write(const char *str, int n); 其中,str是一个字符指针或字符数组,用来存放一个字符串,n是一个整型数,用来表示输出显示字符串中字符的个数。如果显示整个字符串,则取strlen(str)。第一个参数也可以直接给出一个字符串常量。 例如输出字符串常量“C+ program”,可以这样实现: cout.write(C+ program,strlen(C+ program); 例题见课本295页【例9-2】 。,9.2.3 C+的标准输入流 标准输入流是从标准输入设备(键盘)流向内存的数据。 1cin流 cin输入流是最一般的键盘输入,其使用格式如下: cin表达式1表达式2. 在上式中,流提取运算符“”可以连续写多个,每个后面跟一个表达式,表达式通常是获得输入值的变量或对象。例题见课本296页【例9-3 】 。,2用成员函数get()获取一个字符 除了可以用cin输入标准类型的数据外,还可以用istream类的成员函数get()从输入流中获取一个字符,并把它放置到变量中。该函数的使用格式有2种形式:无参数的,有一个参数的。 (1)无参数的get()函数 其调用形式为:cin.get() 其作用是从指定的输入流中提取一个字符,函数的返回值就是读入的字符。若遇到输入流中的文件结束符,则函数值返回文件结束标志EOF(一般情况下认为是-1),例题见课本297页【例9-4】 :,(2)有一个参数的get()函数 其调用形式为:cin.get(char 这里,*buf可以是一个字符数组或一个字符指针。Limit是一个int型数,用来限制从输入流中读取到buf字符数组中的字符个数,最多只能读Limit-1个,因为要留出最后一个位置存放结束符。Deline是读取字符时指定的结束符,其默认值为“n”, 终止字符也可以用其他字符,如cin.get(ch, 10, x)。 该函数的作用是从输入流中读取Limit-1个字符,赋给指定的字符数组 (或字符指针指向的数组),如果在读取Limit-1个字符之前遇到指定的终止字符,则提前结束读取。如果读取成功则函数返回非0值(真),如失败(遇文件结束符) 则函数返回0值(假)。再将【例9-5】改写例题见课本299页:,3用成员函数getline()函数读入一行字符 getline()函数的作用是从输入流中读取一行字符,其用法与上面讲述的利用get()函数输入一行字符的功能类似。即 cin.getline(char *buf,int Limit,Deline=n);,4用成员函数read()读取一串字符 使用成员函数read()可以从输入流中读取指定数目的字符并将它们存放在指定的数组中。该函数使用格式如下: cin.read(char *buf,int size); 其中,buf是用来存放读取来的字符的字符指针或者是字符数组,size是一个int型数,用来指定从输入流中读取字符的个数。课本300页【例9-6】利用read()函数读入字符串,并输出。,5istream类的其他成员函数 除了以上介绍的用于读取数据的成员函数外,istream类还有其他在输入数据时用得着的一些成员函数。常用的有以下几种: (1)eof()函数 eof是end of file的缩写,表示“文件结束”。从输入流读取数据,如果到达文件末尾(遇文件结束符),eof函数值为非零值(表示真),否则为0(假)。其调用格式为: cin.eof(); 课本301页【例9-7】逐个读入一行字符,将其中的非空格字符输出。,(2)peek()函数 peek()函数的作用是从输入流中返回下一个字符,但它只是观测,指针仍停留在当前位置,遇到流结束标志时返回EOF。其调用形式为: c=cin.peek(); 课本301页【例9-8】编制程序,检测字符1后面是字符2的连续字符组的个数。,(3)putback()函数 其调用形式为: cin.putback(ch); 其作用是将前面用get()或getline()函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。 课本302页【例9-9】 putback()函数的用法。,(4)ignore()函数 ignore()函数的作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。 其调用形式为: cin.ignore(int n=1, char /跳过输入流中5个字符,遇A后就不再跳了 课本303页【例9-10】用ignore()函数跳过输入流中的字符。,以上介绍的各个成员函数,不仅可以用cin流对象来调用,而且也可以用istream类的其他流对象来进行调用。,9.3 输入运算符和输出运算符及其重载,9.3.1 输入运算符 输入运算符“”也称为流提取运算符,它是一个二目运算符,有两个操作数,左操作数是istream类的一个对象,右操作数既可以是一个预定义的变量,也可以是重载了该运算符的类对象。因此,输入运算符不仅能够识别预定义类型的变量,如果某个类中重载了这个运算符,它也能识别这个类的对象。 在使用输入运算符时需要注意以下几点: (1)在默认情况下,运算符“”跳过空白符,然后读入与输入变量类型相对应的值。因此,给一组变量输入值时可以用空格或换行符把输入的数值间隔开。 (2)当输入字符串时,运算符“”的作用是跳过空白符,读入的字符串中不要有空格,否则认为是结束。,(3)不同类型的变量一起输入时,系统除了检查是否有空白符外,还完成输入数据与变量类型的匹配。如: int n; float x; cinnx; 如果输入:33.33 22.22 则得到的结果为n=33,x=0.33. (4)输入运算符采用左结合方式,可以将多个输入操作组合到一个语句中。,9.3.2 输出运算符、 输出运算符“”也称为流插入运算符,它是一个二目运算符,有两个操作数,左操作数是ostream类的一个对象,右操作数既可以是一个预定义的变量,也可以是重载了该运算符的类对象。因此,输出运算符不仅能够识别预定义类型的变量,如果某个类中重载了这个运算符,它也能识别这个类的对象。 在使用输出运算符时需要注意以下几点: (1)输出运算符也采用左结合方式,可以将多个输入操作组合到一个语句中。 如:int n=1; double m=1.1; coutn,mendl;,输出结果就是: 1,1.1 (2)使用输出运算符时,不同类型的数据也可以组合在一条语句中,编译程序会根据在“”右边的变量或常量的类型,决定调用重载该运算符的那个版本。,9.3.3 输入运算符和输出运算符的重载 C+的I/O流类库的一个重要特征是能够支持新的数据类型的输入和输出,用户可以通过对输入运算符“”和输出运算符“”和“”重载的知识已经在第7章中做过详细介绍,在此不再赘述。,9.4 C+格式输入和输出,在输出数据时,为简便起见,往往不指定输出的格式,而由系统根据输出数据的类型采取默认的格式,但有时我们希望数据按指定的格式输出。有两种方法可以达到此目的:一种是使用流对象的有关成员函数;另一种是使用控制符。,9.4.1 用ios类提供的格式化函数控制输入/输出格式 1控制格式的标志位 在ios类中声明了数据成员long x_flags,它存储控制输入/输出格式的状态标志,每个状态标志占一位。状态标志的值只能是ios类中定义的课本305页表9-2所列枚举量:,2使用成员函数设置标志字 ios类中定义了一个数据成员来记录当前格式化的状态,即各标志位的设置值,这个数据成员被称为标志字。格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“:”。设置这个标志字的成员函数为setf()。其调用格式如下: stream_obj.setf(ios: flags); 这里,stream_obj是要设置格式标志的流对象,编程时常用的是cin和cout。要设置多个标志时,彼此用位运算符“|”来分隔。如: cout.setf(ios:dec|ios:scientific);,注意: (1)清除状态标志。unsetf()函数用来清除一个状态标志。函数调用格式为: stream_obj.unsetf(ios: flags); 这里,把指定的状态标志位置0,就清除了指定的状态标志。使用方法与setf是类似的。 (2)取标志状态值。flags()函数用来取当前状态标志。有两种使用方法: stream_obj.flags(); stream_obj.flags(ios:flags); 不带参数的函数是返回与流相关的当前状态标志值。带参数的函数是把状态标志值设置为由参数flags指定的值,并返回设置前的状态标志值。注意:函数setf()是在原有的基础上追加设定,而flags()函数是用新值覆盖以前的值。课本306页【例9-11】用flags()函数设置161在不同数制下的数值。,3. 使用成员函数设置域宽、填充字符、精度 在ios类中,除了提供了操作状态标志的成员函数外,还提供了设置域宽、填充字符和对浮点数设置精度的成员函数来对输出进行格式化。 1设置域宽的成员函数width() 该成员函数由两种形式: (1)int width() 该函数用来返回当前输出数据时的宽度。 (2)int width(int wid) 该函数用来设置当前输出数据的宽度为参数值wid,并返回更新前的宽度值。 注:如果输出宽度没有设置,那么默认情况下为数据所占的最少字符数。所设置的域宽仅对下一个输出流由效,当一次输出完成后,域宽恢复为0。,2设置填充字符的成员函数fill() 该成员函数也由两种形式: (1)char fill() 该函数用来返回当前所使用的填充字符。 (2)char fill(char c) 带参数的fill()函数用来设置填充字符为参数c字符,并返回更新前的填充字符。 注意:如果填充字符省略,那么默认填充字符为空格符。如果所设置的数据宽度小于数据所需的最少字符数,则数据宽度按默认宽度处理。,3设置浮点数输出精度的成员函数precision() 该成员函数也有两种形式: (1)int precision() 该函数返回当前浮点数的有效数字的个数。 (2)int precision(int n) 该函数设置浮点数输出时的有效数字个数,并返回更新前的值。 注意:float型实数最多提供7位有效数字,double型实数最多提供15位有效数字,long double型实数最多提供19位有效数字。课本308页【例9-12】利用格式化成员函数来设置输出数据的格式。,9.4.2 用控制符控制输入/输出格式 使用ios类的成员函数来控制输入或输出格式时,必须由流对象来进行调用,使用不方便,可以使用特殊的、类似于函数的运算符来进行控制,这类运算符称为控制符。控制符可以直接嵌入到输入或输出操作的语句中。C+提供的控制符如课本309页表9-3所示:,这些控制符是在iomanip.h中定义的,因此如果在程序中使用这些控制符必须把头文件iomanip.h包含进来。看下面的课本310页【例9-13】用控制符控制输出格式。,9.5 文件操作与文件流,9.5.1 文件的概念 我们前面讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。 所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质上的。操作系统是以文件为单位对数据进行管理的,也就是说,如果想找存储在外部介质上的数据,必须先按文件名找到指定的文件,然后再从文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。外存文件包括磁盘文件、光盘文件和U盘文件。目前使用最广泛的是磁盘文件。,根据文件中数据的组织形式,文件可分为ASCII文件和二进制文件。ASCII文件也称文本文件,其每个字节存一个ASCII代码,表示一个字符。这样的文件使用比较方便,但占用的存储空间较大。二进制文件,是把内存中的存储形式原样写到外存储器中。使用起来可以节省外存空间和转换时间,但是它的一个字节不对应一个字符。 为了实现文件的输入和输出,首先要创建一个文件流,当把这个流和实际的文件相关联时,就称为打开文件。完成输入和输出后要关闭这个文件,即取消文件和流的关联。,9.5.2 文件流类及其流对象 在C+的I/O流类库中定义了几种文件流类,专门用于对磁盘文件的输入输出操作。它们是:ifstream类(支持从磁盘文件的输入)、ofstream类(支持向磁盘文件的输出)和fstream类(支持对磁盘文件的输入输出)。 由前面的知识可以知道在以标准设备为对象的输入输出中,必须定义流对象,如cin,cout就是流对象,C+是通过流对象进行输入输出的。同理如果以磁盘文件为对象进行输入输出,也必须先定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。 由于cin和cout已在iostream.h中事先定义,所以用户不需自己定义就可以使用。但在通过文件流对象对磁盘文件进行操作时,文件流对象没有事先统一定义,必须由用户自己定义。文件流对象是用文件流类定义的,看下面的语句: ofstream outfile; /建立一个输出文件流对象outfile ifstream infile; /建立一个输入文件流对象infile 需要注意的是:如果要在程序中建立文件流对象,必须包含头文件fstream.h。,9.5.3 文件的打开与关闭 磁盘文件的打开和关闭使用fstream类中定义的成员函数open()和close()。 1文件的打开 要对磁盘文件进行读写操作,首先必须要先打开文件。所谓打开文件就是将文件流对象与具体的磁盘文件建立联系,并指定相应的使用方式。以上工作可以通过两种不同的方法实现:(1)先说明一个fstream类的对象,再调用该对象的成员函数open()打开指定的文件。例如,以输出方式打开一个文件的方法如下: ofstream outfile; /定义ofstream类(输出文件流类)对象outfile outfile.open(f1.dat, ios:out); /使文件流与f1.dat文件建立关联,上面第1句定义ofstream类对象outfile,第2句通过outfile调用其成员函数open(),提供了两个实参:第一个是要被打开的文件名,使用文件名时可以包括路径,如“c:newf1.dat”,如果默认路径,则默认为当前目录下的文件。第二个实参说明文件的访问方式。文件访问方式包含多种操作,见课本313页表9-4所示。,(2) 在定义文件流对象时同时指定参数 在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如要实现(1)中说明的以输出方式打开一个文件,方法如下: ofstream outfile(f1.dat, ios:out); 一般多用此形式,相比(1)来说比较方便。作用与open()函数相同,参数含义相同。 注意:对于表9-4中的访问方式可以用“位或”运算符“|”对输入输出方式进行组合。另外,如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。,2关闭磁盘文件 当结束一个磁盘文件的读写操作后,应关闭该文件。关闭文件用成员函数close()。如:outfile.close(); 看课本314页【例9-14】文件操作演示程序。,9.5.4 对文本文件的操作 如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称文本文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。 对文本文件的读写操作可以用流插入运算符“”输入输出标准类型的数据,也可以用文件流的put(),get(),getline()等成员函数进行字符的输入输出。见课本315页【例9-15】 把文本写入指定的文件中。,对于单字符的输入和输出可以使用成员函数get()和put()。下面再举一个使用get()和put()进行文件读写的例子。 课本316页【例9-17】 使用get()和put()进行文本文件读写。,9.5.5 对二进制文件的操作 二进制文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此又称为它字节文件。对二进制文件的操作同样是使用时要先打开文件,用完后要关闭文件。在打开时要用ios:binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。 向二进制文件中写入信息时,使用write()函数,从二进制文件中读信息,使用read()函数。【例9-18】利用这两个函数对一个二进制文件进行读写操作。 课本317页【例9-18】 将4个学生的信息写到student.dat文件中,并读出检测。,9.5.6 随机访问二进制文件 前面所举的例子都是按顺序访问方式进行的。但是对于二进制文件,我们还可以对它进行随机访问。在对一个文件进行读写操作时,系统会为该文件设置一个读写指针,用于指示当前读写的位置。iostream类对读指针进行操作提供了三个成员函数: istream 表示使读指针以当前位置为基准向前移动100个字节。 iostream类对写指针进行操作也提供了三个成员函数: ostream & ostream:seekp() ostream & ostream:seekp(, ) ostream & ostream:tellp() 这三个成员函数的含义与操作同读指针的三个成员函数的含义相同,只是在这里表示操作写指针。 课本319页【例9-19】随机访问二进制文件举例。,9.6 学生信息管理系统中的文件操作,在学生信息管理系统中,关于文件的操作主要是写入学生信息和读出学生信息,因为在系统中没有用到数据库,所以一切信息都是写入到文件中的。系统中的学生类Student和函授生类Correspodence都提供了实现读写学生信息的成员函数ReadFromFile()和WriteToFile()。这些成员函数的实现代码参见第4.8节。,Thank You !,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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