《第8章输入与输出.ppt》由会员分享,可在线阅读,更多相关《第8章输入与输出.ppt(36页珍藏版)》请在三一办公上搜索。
1、第8章 C+的输入和输出,8.1 C+的输入和输出8.2 标准输出流8.3 标准输入流8.4 文件操作与文件流,Next,8.1 C+的输入和输出,8.1.1 输入输出的含义 1)对系统指定的标准设备的输入输出,称为标准输入输出。2)以外存文件为对象的输入输出称为文件的输入输出。3)对内存空间进行输入输出称为字符串输入输出。,Back,Next,因为在C+中用户需要定义众多的自定义类型,但是C语言的输入输出系统不支持用户自定义的类型。请看下面的类:class my_class int i;float f;char*str;obj;,Next,Back,对此类类型,在C语言中下面的语句是不能接受
2、的:printf(%my_class,obj);C+的流类比C的输入输出函数具有更大的优越性。可以重载,使成立:cout obj;,Next,Back,8.1.2 C+的输入输出流,输入和输出是数据传输的过程,称之为流。C+的输入输出流是指若干字节组成的字节序列C+中输入输出流被定义为类。在C+中,流类是为输入输出提供的一组类,它们都放在流库中。,Next,Back,流总是与某一设备相联系的(例如键盘、屏幕或硬盘等),通过使用流类中定义的方法,就可以完成对这些设备的输入输出操作。流具有方向性:与输入设备(如键盘)相联系的流称为输入流;与输出设备(如屏幕)相联系的流称为输出流;与输入输出设备(如
3、磁盘)相联系的流称为输入输出流。,Next,Back,C+中包含几个预定义的流对象:标准输入流 cin 与标准输入设备相关联 标准输出流 cout 与标准输出设备相关联非缓冲型的 cerr 与标准错误输出设备 标准出错流 相关联(非缓冲方式)缓冲型的 clog 与标准错误输出设备 标准出错流 相关联(缓冲方式)在缺省情况下,指定的标准输出设备是屏幕,标准输入设备是键盘,Next,Back,8.1.3 流类库(iostream类库),C+流类库具有两个平行的基类,即streambuf类和ios类,所有其他的流类都是从它们直接或间接地派生出来的,其中:ios类为输入输出操作在用户一方的接口,负责高
4、层操作:streambuf类为输入输出操作在物理设备一方的接口,负责低层操作。,Next,Back,ios,istream,ostream,iostream,ofstream,fstream,ifstream,Ios类的派生关系(P223),Next,Back,8.1.4 与iostream类库有关的头文件,iostream.h 包含了对输入输出流操作所需的基本信息。fstream.h 用户管理的文件的I/O操作strstream.h字符串流I/Ostdiostream.h用于混合使用C和 C+Iomanip.h使用格式化 I/O时应包含它,Next,Back,8.2 标准输出流,8.2.1
5、cout、cerr、和clog流1、cout流对象cout是一个类对象,如cout.put()用cout输出数据时,不必考虑数据类型cout流在内存中开辟了一个缓存区,存放流中数据,遇到endl立即输出,插入一个换行符,并刷新缓存。,Next,Back,Iostream中只对和运算符用于标准数据类型时重载了。其它类型要用户自己重载2、cerr流对象cerr流对象是标准出错流。用于向标准出错设备输出有关信息。,cout流也可以重定向到磁盘,但cerr中的信息则只能输出到显示器。当需要出错信息只出现在显示器上时可用cerr流对象。例8.1对于一元二次方程,当0时应报出错信息。,Next,Back,
6、3、clog流对象clog也是标准出错流。cerr不经缓冲区,直接输出到显示器,clog要存放到缓冲区中直到满或endl。,Next,Back,8.2.2 格式化输入输出,C+提供了两种进行格式控制的方法:使用称为控制符的特殊类型的函数进行格式控制。例8.2,Next,Back,C+提供的预定义操纵符如下:(1)dec 以十进制形式输入或输出整型数,可用于输入或输出。(2)hex 以十六进制形式输入或输出整型数,可用于输入或输出。(3)oct 以八进制形式输入或输出整型数,可用于输入或输出。,Next,Back,(4)ws 用于在输入时跳过前导的空白符,可用于输入。(5)endl 插入一个换行
7、符并刷新输出流,仅用于输出。(6)ends 插入一个空字符0,通常用来结束一个字符串,仅用于输出(7)flush 刷新一个输出流,仅用于输出.,(8)setbase(int n)设置转换基格式为为n(n的取值为0、8、10 或16),n的缺省值为0,即表示采用十进制,仅用于输出。(9)resetiosflags(long f)关闭由参数f指定的格式标志,可用于输入或输出(10)setiosflags(long f)设置由参数f指定的格式标志,可用于输入或输出,Next,Back,(11)setfill(int ch)设置ch为填充字符,缺省时为空格,可用于输入或输出(12)setprecisi
8、on(int n)设置小数部分的位数,可用于输入或输出(13)setw(int n)设置域宽为n,可用于输入或输出。,使用ios类流对象的成员函数进行格式控制;通过调用cout中的相关成员函数来控制输出格式。见表7.4(p229)setf和setiosflags括号中的参数表示格式状态,通过格式标志指定。在ios类的public部分定义了一个格式标志的枚举。见表7.5例8.3,Next,Back,用流成员函数put输出字符Cout流在内存中有相应的缓冲区。put为专用于输出单个字符的函数。参数为字符或ASC码。如:cout.put(a);或 cout.put(97);例8.4,Next,Bac
9、k,8.3标准输入流,8.3.1cin流cin是个类对象,从标准输入设备获取数据。在回车键后,才进入键盘缓冲区,形成输入流,运算符才能从中提取数据。遇到无效数据或文件结束符时,cin处于出错状态。例7.5,Next,Back,8.3.2用于字符输入的流成员函数用get读入一个字符不带参数时:cin.get();返回值即为读取的字符。带一个参数:cin.get(ch);读取的字符赋给ch 三个参数时:cin.get(字符数组,字符个数,终止字符);读取n-1个字符,或见终止符停止,并赋给指定字符数组。例7.6,Next,Back,用成员getline读入一行字符cin.getline(字符数组或
10、字符指针,字符个数n,终止标志字符);作用是从输入流中读取一行字符,用法与带个参数的get函数类似。例7.7,Next,Back,8.4文件操作与文件流,8.4.1文件的概念磁盘文件与数据文件之分,程序中输入输出的对象是程序文件。数据文件分为ASC文件和二进制文件。如 long int 100000 按二进制占4字节,按 ASC格式则占6个字节。C+可以把若干字节整合为类型数据,再以ASC字符形式输出。,Next,Back,8.4.2文件流类与文件流对象文件流是以外存文件为输入输出对象的数据流。都有内存缓冲区对应三个文件类:ifstream 用于从磁盘文件输入ofstream用于向磁盘文件输出
11、fstream用于对磁盘文件输入输出要以磁盘文件为对象的输入输出,必需用到文件流类的对象,如:ofstream outfile;,Next,Back,8.4.3文件的打开与关闭一、打开磁盘文件建立文件流对象与磁盘文件的关联。指定文件工作方式:输入或输出、ASC或二进制二种实现方法:调用流文件成员函数open如:ofstream outfile;outfile.open(“f1.dat”,ios:out);f1.dat为指定的文件名,Next,Back,定义文件流时指定参数如:ostream outfile(“f1.dat”,iso:out);iso:out 为输入方式(见表7.6)P245二、
12、关闭磁盘文件读写操作完成后关闭文件。如:outfile.close();,Next,Back,二种方法:用流插入提取运算符和输入输出标准类型的数据。用文件流的put,get,getline等进行字符的输入输出。例7.11 向磁盘文件f1.dat写入一个数组 例7.12从f1.dat读入一个数组,8.4.4 对ASC文件的操作,Next,Back,8.4.5 对二进制文件的操作,二进制文件是将内存数据不加转换地传送到磁盘文件,因此又称内存映像文件。打开文件时要用ios:binary指定。二进制文件可同时指定为输入与输出文件。,Next,Back,用成员read和write读写二进制文件:istr
13、eam例7.14以二进制形式存入磁盘文件例7.15读入二进制形式的磁盘文件,与文件指针有关的流成员函数(表7.7P254)表中函数带g的是用于输出的函数;带p的是用于输入的函数。文件的位置和偏移量等参数为long型整数,以字节为单位。随机访问二进制数据文件例:7.16,Next,Back,表7.7文件流与文件指针有关的流成员函数,Back,8.5 字符串流,字符串流不是以外存文件为输入输出对象,而是以内存中用户定义的字符数组为输入输出对象。也称内存流字符串流也有相应的缓冲区。字符串流还可存放其它类型数据,但要先将其转换为ASC码。字符串流关联的只是内存中的一个字符数组,因此不用打开和关闭文件。
14、用户要自己指定一个结束标志符。,Next,Back,建立输出字符串流对象构造函数原型为:ostrstream:ostrstream(char*buffer,int n,int mode=ios:out);如:ostrstream str(ch1,20);建立输入字符串流对象 有二个带参数的构造函数:istrstream:istrstream(char*buffer);istrstream:istrstream(char*buffer,int n int);,Next,Back,建立输入输出字符串流对象构造函数原型:strstream:strstream(char*buffer,int n,int mode);例8.17将一数组保存在字符数组中例8.18在一字符数组c中有10个整数,以空格相间,要求将其放到整型数组中,并排序放入c中。,Next,Back,