《C程序设计文件流.pptx》由会员分享,可在线阅读,更多相关《C程序设计文件流.pptx(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1四四.教学过程提要教学过程提要文件和文件流的概念文件的打开、关闭和读写顺序文件随机文件布置作业题目和实验第1页/共45页2内容提要3.11文件流操作第2页/共45页3先看一个例子:#include void main()/程序从这里开始运行ofstream SaveFile(e:f1.txt);SaveFile”;而向一个文件写入数据,可以使用其put、write函数以及插入符“”;而向一个文件写入数据,可以使用put、write函数以及插入符“”。第17页/共45页18【例3.11-1】向顺序文件的读写操作#include#include /文件操作必须的头文件void main()fst
2、ream file1;/定义一个fstream类的对象用于读file1.open(Ex_DataFile.txt,ios:in);if(!file1)coutEx_DataFile.txt不能打开!n;return;fstream file2;/定义一个fstream类的对象用于写file2.open(Ex_DataFileBak.txt,ios:out|ios:trunc);第18页/共45页19if(!file2)coutEx_DataFileBak.txt不能创建!n;file1.close();return;char ch;while(file1.get(ch)/或:file1.rea
3、d(&ch,1)coutch;file2.write(&ch,1);/或:file2ch file2.close();/不要忘记文件使用结束后要及时关闭file1.close();第19页/共45页20【例3.11-2】有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组存到磁盘文件中.#include“fstream.h”int main()int a10;ofstream outfile(f1.dat,ios:out);/定义文件流对象,打开磁盘文件f1.dat if(!outfile)/如果打开失败,outfile返回0值 coutopen error!endl;retur
4、n(1);第20页/共45页21 coutenter 10 integer numbers:endl;for(int i=0;iai;outfileai;/向磁盘文件输出数据 outfile.close();/关闭磁盘文件f1.dat return 0;第21页/共45页22运行情况如下运行情况如下:enter10integernumbers:enter10integernumbers:1352461087913524610879 请注意请注意:在向磁盘文件输出一个数据后,要输出一在向磁盘文件输出一个数据后,要输出一个个(或几个或几个)空格或换行符,以作为数据间的分隔,空格或换行符,以作为数据
5、间的分隔,否则以后从磁盘文件读数据时,否则以后从磁盘文件读数据时,1010个整数的数字连个整数的数字连成一片无法区分。成一片无法区分。第22页/共45页23【例例3.11_33.11_3】从例从例3.11_23.11_2建立的数据文件建立的数据文件f1.datf1.dat中读入中读入1010个整数放在数组中,找出并输出个整数放在数组中,找出并输出1010个数中的最大者和它在个数中的最大者和它在数组中的序号。数组中的序号。#include#include“fstream.hfstream.h”intmain()intmain()inta10,max,i,order;inta10,max,i,or
6、der;ifstreaminfile(ifstreaminfile(“f1.datf1.dat”,ios:in|ios:nocreate);,ios:in|ios:nocreate);/定义输入文件流对象,以输入方式打开磁盘文件定义输入文件流对象,以输入方式打开磁盘文件f1.datf1.datif(!infile)if(!infile)coutcout“openerror!openerror!”endl;endl;return(1);return(1);第23页/共45页24for(i=0;iai;/从磁盘文件读入10个整数,顺序存放在a数组中 coutai;/在显示器上顺序显示10个数 co
7、utendl;max=a0;order=0;第24页/共45页25 for(i=1;imax)max=ai;/将当前最大值放在max中 order=i;/将当前最大值的元素序号放在order中 coutmax=maxendlorder=orderendl;infile.close();return 0;第25页/共45页263.11.4 随机文件操作随机文件操作,即在文件中通过C+相关的函数移动文件指针,并指向所要处理的字符(字节)。(1)在istream类中提供了3个操作读指针的成员函数:istream&istream:seekg(longpos);istream&istream:seekg
8、(longoff,ios:seek_dirdir);streamposistream:tellg();第26页/共45页27其中,pos为文件指针的绝对位置;off为文件指针的相对偏移量;dir为文件指针的参照位置,其值可能为:ios:cur文件指针的当前位置ios:beg文件开头ios:end文件尾tellg()函数没有参数,它返回一个long型值,用来表示从文件开始处到当前指针位置之间的字节数。第27页/共45页28(2)在ostream类中同样提供了3个操作写指针的成员函数:ostream&istream:seekp(longpos);ostream&istream:seekp(long
9、off,dir);streamposistream:tellp();这3个成员函数的含义与前面3个操作读指针成员函数的含义相同,只不过它们是用来操作写指针的。第28页/共45页29【例3.11_4】将一批数据以二进制形式存放在磁盘文件中。#include fstream.hstruct student char name20;int num;int age;char sex;int main()student stud3=Li,1001,18,f,Fun,1002,19,m,Wang,1004,17,f;第29页/共45页30ofstream outfile(e:stud.dat,ios:bi
10、nary);if(!outfile)coutopen error!endl;return 1;/退出程序 for(int i=0;i3;i+)outfile.write(char*)&studi,sizeof(studi);outfile.close();return 0;第30页/共45页31【例3.11_5】将3.11_4以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。#include fstream.hstruct student char name20;int num;int age;char sex;int main()student stud3;int i;ifstre
11、am infile(stud.dat,ios:binary);第31页/共45页32if(!infile)coutopen error!endl;return(0);for(i=0;i3;i+)infile.read(char*)&studi,sizeof(studi);infile.close();for(i=0;i3;i+)coutNO.i+1endl;coutname:studi.nameendl;coutnum:studi.numendl;coutage:studi.ageendl;coutsex:studi.sexendlendl;return 0;第32页/共45页33问题:如果只
12、想读出第2个学生的信息,如何修改程序?第33页/共45页34【例3.11_6】重载流输出输入运算符读写随机文件的#include#include#include#include class CStudentpublic:CStudent(char*name,char*id,float score=0);void print();friend ostream&operator(istream&is,CStudent&stu);private:char strName10;/姓名char strID10;/学号float fScore;/成绩;第34页/共45页35续例3.11_6CStudent
13、:CStudent(char*name,char*id,float score)strncpy(strName,name,10);strncpy(strID,id,10);fScore=score;void CStudent:print()coutendl学生信息如下:endl;cout姓名:strNameendl;cout学号:strIDendl;cout成绩:fScoreendl;第35页/共45页36ostream&operator(istream&is,CStudent&stu)char name10;char id10;is.read(name,10);is.read(id,10);
14、is.read(char*)&stu.fScore,4);strncpy(stu.strName,name,10);strncpy(stu.strID,id,10);return is;续例3.11_6第36页/共45页37void main()CStudent stu1(MaWenTao,99001,88);CStudent stu2(LiMing,99002,92);CStudent stu3(WangFang,99003,89);CStudent stu4(YangYang,99004,90);CStudent stu5(DingNing,99005,80);fstream file1;
15、file1.open(student.dat,ios:out|ios:in|ios:binary);file1stu1stu2stu3stu4*one;one-print();续例3.11_6第37页/共45页38续例3.11_6file1.seekp(size*1);file1*one;one-print();file1.seekp(size*2,ios:cur);file1*one;one-print();file1.close();delete one;第38页/共45页39续例3.11_6运行结果如下:程序中,先将五个学生记录保存到文件中,然后移动文件指针,读取相应的记录,最后将数据输
16、出到屏幕上。需要说明的是,由于文件流file1既可以读(ios:in)也可以写(ios:out),因此用seekg代替程序中的seekp,其结果也是一样的。第39页/共45页40作业 71、建立两个磁盘文件f1.dat和f2.dat,编程实现以下工作:(1)从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);(2)从f1.dat读入10个数,然后存放到f2.dat文件原有数据的后面;(3)从f2.dat中读入20个整数,将它们按从小到大排序存放到f2.dat(不保留原来的数据)。第40页/共45页412、编程实现以下功能:(1)按职工号由小到大的顺序将5个员工的数据(包括
17、职工号、姓名、年龄、工资)输出到磁盘文件中保存。(2)从键盘输入1个员工的数据(职工号大于已有的职工号),增加到文件的末尾。(3)输出文件中全部职工的数据。(4)从键盘输入一个号码,从文件中查找有无此职工号,如有则显示此职工的全部数据。如果没有,就输出“查无此人”。可以反复多次查询,如果输入查找的职工号为0,就结束查询。第41页/共45页42实验5内容参见“实验报告5”。第42页/共45页43实验6实验题目:设计复数计算器目的和要求(1)掌握函数重载的特性;(2)掌握运算符重载的特性;(3)掌握文件读写的编程方法。设计任务和要求:(1)所设计的复数计算器可以进行+、-、*、+=、*=、+、-、=、=、=是针对复数的模进行;(2)设计输入重载函数,要求能接收从键盘输入a+bi形式的复数,在程序中可以识别出实部并正确赋值。第43页/共45页44(3)设计计算器测试程序,对加减法进行测试,要求在两位数以内进行,对乘法进行测试,乘法要求为一位数的运算。(4)设计记录功能,可以记录下不同用户使用计算器的情况,记录以文件形式保存在计算机内,程序运行时要求输入用户名,显示该用户以前的记录。用户记录包括:做了多少次加减法、乘法、进行测试的次数,后3次的测试平均分等,在退出计算器程序时用新的用户记录代替原有记录。第44页/共45页45感谢您的欣赏!第45页/共45页
限制150内