C程序设计-第9章保存程序数据.ppt

上传人:牧羊曲112 文档编号:5426136 上传时间:2023-07-05 格式:PPT 页数:37 大小:294KB
返回 下载 相关 举报
C程序设计-第9章保存程序数据.ppt_第1页
第1页 / 共37页
C程序设计-第9章保存程序数据.ppt_第2页
第2页 / 共37页
C程序设计-第9章保存程序数据.ppt_第3页
第3页 / 共37页
C程序设计-第9章保存程序数据.ppt_第4页
第4页 / 共37页
C程序设计-第9章保存程序数据.ppt_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C程序设计-第9章保存程序数据.ppt》由会员分享,可在线阅读,更多相关《C程序设计-第9章保存程序数据.ppt(37页珍藏版)》请在三一办公上搜索。

1、2023/7/5,第1页,第9章 保存程序数据,案例:将“学生信息管理系统”的学生信息进行永久保存使用文件保存学生信息案例实施学生练习拓展小结,2023/7/5,第2页,案例:保存学生信息,在本章,将继续完善“学生信息管理系统”案例程序。本章可以实现对学生完整信息的长期保存,能将学生的基本信息保存在磁盘上。当需要的时候可以从磁盘上读出数据,当数据被修改的时候,能重新写回磁盘,保证磁盘上的数据和内存数据一致。具体包括:(1)将学生的完整信息保存在磁盘的指定位置;(2)在程序运行的时候可以加载指定文件中的学生信息;,2023/7/5,第3页,使用文件保存学生信息-文件概念,它一般指存储在外部介质上

2、数据的集合。操作系统是以文件为单位对数据进行管理的。根据文件的组织形式,C语言将文件分为文本文件和二进制文件两种。,2023/7/5,第4页,按文本文件存放数据时,每个字符占一个字节,并且按其ASCII码存储到文件中,所以文本文件也称为ASCII文件。它的每个字节放一个ASCII代码,代表一个字符。,2023/7/5,第5页,按二进制文件存放数据,其存放形式与数据在内存中的存储形式相同,也就是说数据是按其在内存中的存储形式原样输出到磁盘上存放。所以不需要转换,从而可以提高效率而且也能节省存储空间。,2023/7/5,第6页,在C语言中,对文件的读写都是通过库函数实现的。,2023/7/5,第7

3、页,使用文件保存学生信息-文件操作,文件的处理必须包括:打开文件读或写文件、关闭文件,2023/7/5,第8页,使用文件保存学生信息-打开文件,标准输入输出函数,用fopen()函数来实现打开文件。fopen函数的调用方式通常是:FILE*fs;fs=fopen(文件名,打开模式);,2023/7/5,第9页,其中 fs是一个文件指针,文件指针是FILE类型,FILE类型已由系统声明,可直接使用。通过文件指针,可以对它所指向的文件进行各种操作。,2023/7/5,第10页,fopen是一个系统函数,有两个参数,其中文件名包括文件所在的全部路径,路径的分隔符应采用转义字符的形式。文件可以是文本文

4、件,也可以是二进制文件。,2023/7/5,第11页,打开模式是指定所要打开的文件读写方式,打开模式要用小写,并且要用双引号括起来,2023/7/5,第12页,使用文件保存学生信息-打开文件,2023/7/5,第13页,使用文件保存学生信息-打开文件,如果不能实现“打开”文件的任务,fopen函数将会带回一个出错信息,出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已经满了,无法建立一个新文件等。此时fopen函数将带回一个空指针值NULL。,2023/7/5,第14页,常常用下面的方法打开一个文件:if(fs=fopen(file1,r)=NULL)printf(cann

5、ot open this filen);exit(0);,2023/7/5,第15页,使用文件保存学生信息-读写文件,fread函数和fwrite函数,一般调用形式为:fread(buffer,size,count,fs);fwrite(buffer,size,count,fs);,2023/7/5,第16页,其中:buffer是一个指针,对fread来说,它是读入数据的存放地址,对fwrite来说,它是要输出数据的地址,都是指起始地址。size要读写的字节数。count要进行读写多少个size字节的数据项。fs文件类型的指针。,2023/7/5,第17页,使用文件保存学生信息-读写文件,St

6、udent*stu;stu=(Student*)malloc(total*sizeof(Student);假设学生的数据已经存放在磁盘文件中,并且存放了current个学生的信息,这时可以用下面的for语句和 fread函数读入current个学生的数据:for(i=0;icurrent;i+)fread(stu+i),sizeof(Student),1,fs);,2023/7/5,第18页,可以用fwrite函数把内存中的学生数据输出到磁盘文件中去:for(i=0;icurrent;i+)fwrite(stu+i),sizeof(Student),1,fs);,2023/7/5,第19页,使

7、用文件保存学生信息-读写文件,fseek函数可以实现改变文件的位置指针。调用形式为:fseek(文件指针,位移量,起始点)其中起始点用0、1和2代替,0代表“文件的开始”,1代表“当前位置”,2代表“文件的末尾”位移量是指以“起始点”为基点,向前移动的字节数(该位移量可以为正数,也可以是负数)。,2023/7/5,第20页,ANSI C要求位移量是long型数据,这样当文件的长度大于64K时不会出问题。ANSI C标准规定在数字的末尾加一个字母L,表示是long型。同时fseek函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往发生混乱。可以用:succ=fseek(fs,0,

8、SEEK_END);使得fseek函数返回文件的末尾。,2023/7/5,第21页,使用文件保存学生信息-读写文件,ftell()函数的作用是得到文件中的当前位置,用相对于文件开头的位移量来表示。由于文件中的位置指针经常移动,人们往往不容易知道当前的位置。用ftell函数可以得到当前的位置,如果ftell函数返回值为-1L,表示出错。如:i=ftell(fs);if(i=-1L)printf(errorn);,2023/7/5,第22页,使用文件保存学生信息-关闭文件,在使用完一个文件后应该关闭它,以防止它再被误用。“关闭文件”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,

9、此后不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。,2023/7/5,第23页,用fclose函数关闭文件。fclose函数的调用形式为:fclose(文件指针);fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为0,否则返回为EOF(-1)。,2023/7/5,第24页,前面曾经把打开文件(用fopen函数)时所带回的指针赋给了fs,今通过 fs把该文件关闭,使其不再指向该文件。在编写程序的时候,应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将可能造成数据的丢失。,2023/7/5,第25页,案例实施-使用文件保存学生信

10、息,int save()int count;FILE*fs;fs=fopen(StudentData.dat,wb);if(fs=NULL)printf(不能打开文件n);return 1;,2023/7/5,第26页,count=fwrite(stu,sizeof(Student),current,fs);fclose(fs);if(count!=current)printf(保存失败n);return 1;printf(保存成功n);return 0;,2023/7/5,第27页,案例实施-使用文件保存学生信息,int load()FILE*fs;int count;int succ;fs

11、=fopen(StudentData.dat,rb);if(fs=NULL)printf(不能打开文件n);return 1;succ=fseek(fs,0,SEEK_END);,2023/7/5,第28页,if(succ!=0)printf(文件操作失败n);fclose(fs);return 1;count=ftell(fs);fseek(fs,0,SEEK_SET);current=count/sizeof(Student);count=fread(stu,sizeof(Student),current,fs);fclose(fs);,2023/7/5,第29页,if(count!=cu

12、rrent)printf(读文件失败n);return 1;printf(读文件成功n);return 0;,2023/7/5,第30页,学生练习,到现在为止,已经完成对学生信息进行永久保存了,即将学生的完整信息以指定的文件名保存到磁盘上指定的位置。同时也可以将磁盘上文件中的学生信息读入。现在到了你们完成图书信息管理系统中的数据保存和加载的时候了。继续完善你的案例程序,使之可以将图书信息在磁盘上进行长期保存,同时又可以将磁盘上文件的信息读入。具体要求:(1)编写能保存图书信息的案例程序;(2)编写能加载图书信息的案例程序;(3)在CodeBlocks环境下调试你的程序,使之正确运行。,2023

13、/7/5,第31页,拓展-open函数,open()函数的作用是打开文件,其调用格式为:int open(const char*path,int access,unsigned mode);参数path是要打开的文件名,access是打开的模式,mode是修饰符,可选项。表示文件的属性,修饰符可以有多个,但基本模式只能有一个。,2023/7/5,第32页,文件open()函数打开成功,返回值就是文件描述字的值(非负值),否则返回-1。比如在案例程序“学生信息管理系统”中要在磁盘上保存学生信息。如果以StudentData.dat文件名保存在当前路径下,并且是以二进制文件保存。则基本模式为O_W

14、RONLY。其打开文件代码为:fhandle=open(StudentData.dat,O_WRONLY|O_CREAT|O_TRUNC);如果现在想读取上面存储的学生信息,这个时候首先是以只读方式打开数据库文件。其代码是:fhandle=open(StudentData.dat,O_RDONLY);,2023/7/5,第33页,拓展-write函数,write函数写一块数据到文件中。其调用格式为:int write(int handle,void*buf,unsigned len);参数buf读出的数据,len是写入的字节,函数返回实际写入的字节。如上面打开了文件,同时open函数的返回值赋

15、给了整形变量fhandle。学生数据保存在结构体数组stu中,学生数目为current个,则把学生信息写入打开的数据库文件中的代码为:write(fhandle,stu,sizeof(Student)*current);,2023/7/5,第34页,拓展-read函数,read()从文件读取一块数据。其调用格式为:int read(int handle,void*buf,unsigned len);参数buf保存读出的数据,len是读取的字节。函数返回实际读出的字节。同样可以把刚刚保存的学生信息从新加载。则代码为:read(fhandle,stu,sizeof(Student)*current

16、);,2023/7/5,第35页,拓展-lseek函数,lseek()函数定位到指定的位置,其调用格式为:long lseek(int handle,long offset,int fromwhere);参数offset是移动的量,fromwhere是移动的基准位置,取值和前面讲的fseek()一样,SEEK_SET:文件首部;SEEK_CUR:文件当前位置;SEEK_END:文件尾。此函数返回执行后文件新的存取位置。,2023/7/5,第36页,拓展-close函数,同样的,当打开了文件不用的时候,也需要关闭文件,在这里关闭文件使用close函数。close()关闭一个句柄,其调用格式为:int close(int handle);同样,在前面的open函数中,调用它打开一个文件,同时返回一个句柄,赋给了变量fhandle。现在就可以通过close函数来关闭文件。其代码是:close(fhandle);,2023/7/5,第37页,小结,本章介绍了C语言程序设计的文件操作,并应用文件操作完善了案例程序“学生信息管理系统”的设计,通过使用文件操作实现了对学生信息的长期保存以及保存数据如何加载。文件是C语言中很重要的内容,在许多实际的C程序中都包含文件处理。希望学生在实践中掌握文件的使用。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号