第七章输入输出流2.ppt
《第七章输入输出流2.ppt》由会员分享,可在线阅读,更多相关《第七章输入输出流2.ppt(45页珍藏版)》请在三一办公上搜索。
1、在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质上的。操作系统是以文件为单位对数据进行管理的。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。,7.4 文件操作与文件流 7.4.1 文件的概念,外存文件包括磁盘文件、光盘文件和U盘文件。目前使用最广泛的是磁盘文件。对用户来说,常用到的文件有两大类,一类是程序文件(program file)。一类是数据文件(data file)。程序中的输入和输出的对象就是数据文件。根据文件中数据的组织形式,可分为AS
2、CII文件和二进制文件。对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。,图7.5 C+提供低级的I/O功能和高级的I/O功能。高级的I/O功能是把若干个字节组合为一个有意义的单位,然后以ASCII字符形式输入和输出。传输大容量的文件时由于数据格式转换,速度较慢,效率不高。所谓低级的I/O功能是以字节为单位输入和输出的,在输入和输出时不进行数据格式的转换。,文件流是以外存文件为输入输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都
3、有一个内存缓冲区与之对应。请区分文件流与文件的概念。文件流本身不是文件,而只是以文件为输入输出对象的流。若要对磁盘文件输入输出,就必须通过文件流来实现。在C+的I/O类库中定义了几种文件类,专门用于对磁盘文件的输入输出操作。在图7.2中可以看到3个用于文件操作的文件类:,7.4.2 文件流类与文件流对象,(1)ifstream类,它是从istream类派生的。用来支持从磁盘文件的输入。(2)ofstream类,它是从ostream类派生的。用来支持向磁盘文件的输出。(3)fstream类,它是从iostream类派生的。用来支持对磁盘文件的输入输出。要以磁盘文件为对象进行输入输出,必须定义一个
4、文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。其实在用标准设备为对象的输入输出中,也是要定义流对象的,如cin,cout就是流对象,C+是通过流对象进行输入输出的。,在用磁盘文件时,由于情况各异,无法事先统一定义,必须由用户自己定义。可以用下面的方法建立一个输出文件流对象:ofstream outfile;现在在程序中定义了outfile为ofstream类(输出文件流类)的对象。但是有一个问题还未解决:在定义cout时已将它和标准输出设备建立关联,而现在虽然建立了一个输出文件流对象,但是还未指定它向哪一个磁盘文件输出,需要在使用时加以
5、指定。,1.打开磁盘文件 打开文件是指在文件读写之前做必要的准备工作,包括:(1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。(2)指定文件的工作方式。以上工作可以通过两种不同的方法实现。a.调用文件流的成员函数open。如ofstream outfile;/定义ofstream类(输出文件流类)对象outfileoutfile.open(f1.dat,ios:out);/使文件流与f1.dat文件建立关联调用成员函数open的一般形式为,7.4.3 文件的打开与关闭,文件流对象.open(磁盘文件名,输入输出方式);磁盘文件名可以包括路径,如c:newf1.dat,
6、如缺省路径,则默认为当前目录下的文件。b.在定义文件流对象时指定参数 在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如 ostream outfile(f1.dat,ios:out);一般多用此形式,比较方便。作用与open函数相同。输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,见书中表7.6。,说明:新版本的I/O类库中不提供ios:nocreate和ios:noreplace。每一个打开的文件都有一个文件指针。可以用“位或”运算符“|”对输入输出方式进行组合。如果打开操
7、作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。,2.关闭磁盘文件 在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如 outfile.close();/将输出文件流所关联的磁盘文件关闭 所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。如 outfile.open(f2.dat,ios:app|ios:nocreate);此时文件流outfile与f2.dat建立关
8、联,并指定了f2.dat的工作方式。,如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符。对ASCII文件的读写操作可以用以下两种方法:(1)用流插入运算符“”输入输出标准类型的数据。(2)用本章7.2.3节和7.3.2节中介绍的文件流的put,get,geiline等成员函数进行字符的输入输出。,7.4.4 对ASCII文件的操作,例7.11 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中存放。#include int a1
9、0;ofstream outfile(f1.dat,ios:out);/定义文件流对象,打开磁盘文件 if(!outfile)/如果打开失败,outfile返回0值 cerrai;outfileai;/向磁盘文件f1.dat输出数据 outfile.close();/关闭磁盘文件f1.dat return 0;,运行情况如下:enter 10 integer numbers:1 3 5 2 4 6 10 8 7 9 请注意:在向磁盘文件输出一个数据后,要输出一个(或几个)空格或换行符,以作为数据间的分隔,否则以后从磁盘文件读数据时,10个整数的数字连成一片无法区分。,例7.12 从例7.11建
10、立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。例7.13 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件f3.dat。,#include using namespace std;/save_to_file函数从键盘读入一行字符,并将其中的字母存入磁盘文件void save_to_file()ofstream outfile(f2.dat);/定义输出文件流对象outfile,以输出方式打开磁盘文件f2.dat if(!outfile)cerr=65
11、/关闭f2.dat,/从磁盘文件f2.dat读入字母字符,将其中的小写字母改为大写字母,再存入f3.datvoid get_from_file()char ch;ifstream infile(f2.dat,ios:in|ios:nocreate);/定义输入文件流outfile,以输入方式打开磁盘文件f2.dat if(!infile)cerropen f2.dat error!endl;exit(1);ofstream outfile(f3.dat);/定义输出文件流outfile,以输出方式打开磁盘文件f3.dat if(!outfile)cerropen f3.dat error!en
12、dl;exit(1);,while(infile.get(ch)/当读取字符成功时执行下面的复合语句 if(ch=97 运行情况如下:New Beijing,Great Olypic,2008,China.NewBeijingGreatOlypicChina(将字母写入磁盘文件f2.dat,同时在屏幕显示)NEWBEIJINGGREATOLYPICCHINA(改为大写字母),磁盘文件f3.dat的内容虽然是ASCII字符,但人们是不能直接看到的,如果想从显示器上观看磁盘上ASCII文件的内容,可以采用以下两个方法:(1)在DOS环境下用TYPE命令,如D:C+TYPE f3.dat(假设当前目
13、录是D:C+)在显示屏上会输出NEWBEIJINGGREATOLYPICCHINA如果用GCC编译环境,可选择File菜单中的DOS Shell菜单项,即可进入DOS环境。想从DOS返回GCC主窗口,从键盘输入exit即可。(2)编一程序将磁盘文件内容读入内存,然后输出到显示器。可以编一个专用函数。#include using namespace std;,void display_file(char*filename)ifstream infile(filename,ios:in|ios:nocreate);if(!infile)cerropen error!endl;exit(1);cha
14、r ch;while(infile.get(ch)cout.put(ch);coutendl;infile.close();然后在调用时给出文件名即可:int main()display_file(f3.dat);/将f3.dat的入口地址传给形参filename return 0;运行时输出f3.dat中的字符:NEWBEIJINGGREATOLYPICCHINA,二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。对二进制文件的操作也需要先
15、打开文件,用完后要关闭文件。在打开时要用ios:binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。,7.4.5 对二进制文件的操作,1.用成员函数read和write读写二进制文件 对二进制文件的读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为 istream,例7.14 将一批数据以二进制形式存放在磁盘文件中。#include using namespace std;struct studentchar name20;int num;int age;cha
16、r sex;int main()student stud3=Li,1001,18,f,Fun,1002,19,m,Wang,1004,17,f;ofstream outfile(stud.dat,ios:binary);if(!outfile)cerropen error!endl;abort();/退出程序,for(int i=0;i3;i+)outfile.write(char*)执行一次write函数即输出了结构体数组的全部数据。可以看到,用这种方法一次可以输出一批数据,效率较高。在输出的数据之间不必加入空格,在一次输出之后也不必加回车换行符。在以后从该文件读入数据时不是靠空格作为数据的
17、间隔,而是用字节数来控制。,例7.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include using namespace std;struct studentstring name;int num;int age;char sex;int main()student stud3;int i;ifstream infile(stud.dat,ios:binary);if(!infile)cerropen error!endl;abort();,for(i=0;i3;i+)infile.read(char*)运行时在显示器上显示:NO.1name:Linum:10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 输入输出
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5650924.html