c语言-第10章利用文件保存数据刘佳_第1页
c语言-第10章利用文件保存数据刘佳_第2页
c语言-第10章利用文件保存数据刘佳_第3页
c语言-第10章利用文件保存数据刘佳_第4页
c语言-第10章利用文件保存数据刘佳_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C C语言程序设计语言程序设计第第1010章利用文件保存数据章利用文件保存数据软件学院:刘佳软件学院:刘佳文件的基本概念文件的基本概念文件路径文件路径文件名主干文件名主干文件后缀文件后缀d: cctempfile1.dat通常:文件标识被称为文件名。后缀用来表示文件的性质,一般不超过通常:文件标识被称为文件名。后缀用来表示文件的性质,一般不超过3个字母;个字母;Doc,txt,dat,c,exe,ppt,bmp等等。等等。文件的类别文件的类别 按文件的逻辑结构:按文件的逻辑结构:l 记录文件:由具有一定结构的记录组成(定长和记录文件:由具有一定结构的记录组成(定长和不定不定 长),帮助记忆的都

2、可以成为记录文件。长),帮助记忆的都可以成为记录文件。 流流式文件式文件:构成文件的基本单位为:构成文件的基本单位为字符字符,长度为所包含字,长度为所包含字 符的个数,又称字符流文件。符的个数,又称字符流文件。按按存储介质:存储介质:l 普通文件:存储介质文件(磁盘、磁带等)普通文件:存储介质文件(磁盘、磁带等)l 设备文件:非存储介质(键盘、显示器、打印机等)设备文件:非存储介质(键盘、显示器、打印机等) 按文件的内容按文件的内容l 程序文件。程序文件又可分为源文件、目标文件和可执行程序文件。程序文件又可分为源文件、目标文件和可执行文件。文件。l 数据文件。如各种图像文件、声音文件等。数据文

3、件。如各种图像文件、声音文件等。文件的类别文件的类别 根根据文件的组织形式据文件的组织形式l 顺序存取文件;顺序存取文件;l 随机存取文件。随机存取文件。 按数据的组织形式:按数据的组织形式:l 文本文件:文本文件: ASCIIASCII文件文件,每个字节存放一个字符的,每个字节存放一个字符的ASCIIASCII码码l 二进制文件:数据按其在内存中的存储形式原样存放二进制文件:数据按其在内存中的存储形式原样存放按数据分类的文件,是我按数据分类的文件,是我们今天学习的内容们今天学习的内容0011000100110000001100000011000000110000(1)(0)(0)(0)ASC

4、II形式:一个字节代表一个字符,便于输出字符形式:一个字节代表一个字符,便于输出字符0010011100010000二进制形式:一个字节不对应一个字符,不能直接输出字符形式二进制形式:一个字节不对应一个字符,不能直接输出字符形式(10000)ASCII文件:每一个字节放一个字符的ASCII码 。二进制文件:数据在内存中是以二进制形式存储的, 不加转换地输出到外存。(0)整数整数10000:分别占:分别占5字节和字节和2字节字节文件处理方法文件处理方法l缓冲文件系统缓冲文件系统:系统自动为正在使用的文件开辟内存缓:系统自动为正在使用的文件开辟内存缓冲区冲区a文件指针文件指针 文件类型指针文件类型

5、指针直接用直接用FILE类型名定义变量,每一个类型名定义变量,每一个FILE类型变量对类型变量对应一个文件的信息区,包含该文件的有关信息。应一个文件的信息区,包含该文件的有关信息。FILEf; 定义了一个结构体变量定义了一个结构体变量f,可以用它来存放一个文件的有可以用它来存放一个文件的有关信息,这些信息是建立文件时根据文件的性质由编译关信息,这些信息是建立文件时根据文件的性质由编译系统自动放入的。系统自动放入的。一般不对一般不对FILE类型变量命名,而是设置一个指向类型变量命名,而是设置一个指向FILE类型变类型变量的指针变量,用指针变量来引用量的指针变量,用指针变量来引用FILE类型变量。

6、类型变量。 文件类型指针文件类型指针定义定义指向文件型数据的指针变量: FILE *fp;文件文件f1的的文件信息区文件信息区fp1文件文件f2的的文件信息区文件信息区fp2文件文件f3的的文件信息区文件信息区fp3FILE*fp1,*fp2,*fp3; /n个文件设置个文件设置n个指针变量个指针变量文件的打开、读写和关闭文件的打开、读写和关闭 用法:用法:文件打开文件打开时,系统时,系统自动自动建立文件信息区和缓冲区,文件指针变量指向文件,建立文件信息区和缓冲区,文件指针变量指向文件,文件关闭文件关闭后,它的文件信息区和缓存区被释放,指针变量不指向文件。后,它的文件信息区和缓存区被释放,指针

7、变量不指向文件。打开文件的打开文件的方式字符方式字符含 义r打开一个已存在的文件,准备从文件中打开一个已存在的文件,准备从文件中读取数据读取数据。不能向。不能向文件写数据文件写数据w创建一个新文件,准备向文件创建一个新文件,准备向文件写入数据写入数据。不能从文件中读。不能从文件中读取数据。如果文件已经存在,这个文件将被覆盖取数据。如果文件已经存在,这个文件将被覆盖a打开一个已存在的文件,准备在文件尾部打开一个已存在的文件,准备在文件尾部添添加数据加数据。不能。不能从文件中读取数据。如果文件不存在,则创建这个文件准从文件中读取数据。如果文件不存在,则创建这个文件准备写入数据备写入数据r+打开一个

8、已存在的文件,准备打开一个已存在的文件,准备读写读写。既可以读取数据,也。既可以读取数据,也可以写入数据可以写入数据w+创建一个新文件,准备创建一个新文件,准备读写读写。如果文件已经存在,则覆盖。如果文件已经存在,则覆盖原文件原文件a+等价于等价于a,但可从文件中,但可从文件中读取数据读取数据t打开一个打开一个文本文件文本文件b打开一个打开一个二进制文件二进制文件a在在顺序写顺序写时,先写入的数据存放在文件中前面,时,先写入的数据存放在文件中前面,后写入的数据存放在文件中后面后写入的数据存放在文件中后面在在顺序读顺序读时,先读文件中前面的数据,后读文时,先读文件中前面的数据,后读文件中后面的数

9、据件中后面的数据对对顺序读写顺序读写来说,对文件读写数据的顺序和数来说,对文件读写数据的顺序和数据在文件中的物理顺序是一致的据在文件中的物理顺序是一致的 文件的顺序读写文件的顺序读写 知识点回顾知识点回顾 字符数据的输入输出字符数据的输入输出 getchar()() putchar()()字符输入函数:从终端输入字符输入函数:从终端输入一个字符一个字符字符输出函数:向终端输出字符输出函数:向终端输出一个字符一个字符注意:输入输出的是一个字符,调用注意:输入输出的是一个字符,调用getchargetchar()()函数,必须加上函数,必须加上#include#include【例例10.110.1

10、】从键盘输入一些字符,逐个把它们送到磁盘上从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个去,直到输入一个“#”#”为止为止 解题思路:解题思路:1、用、用getchar函数从键盘逐个输入字符。函数从键盘逐个输入字符。2、然后用、然后用fputc函数写到磁盘函数写到磁盘file1.dat文件。文件。3、输入一个字符写一个字符,反复循环,直到满足条件。、输入一个字符写一个字符,反复循环,直到满足条件。while()的条件为字符!()的条件为字符!=#include #include int main() FILE *fp; char ch,filename10; printf(请输入所用

11、的文件名:请输入所用的文件名:); scanf(%s,filename); if(fp=fopen(filename,w)=NULL) / 打开输出文件使打开输出文件使fp指向此文件指向此文件 printf(无法打开此文件无法打开此文件n); / 如果打开时出错,就输出如果打开时出错,就输出打不开打不开的信息的信息 exit(0); / 终止程序终止程序*/ ch=getchar( ); / 接收在执行接收在执行scanf语句时最后输入的回车符语句时最后输入的回车符 printf(请输入一个字符串请输入一个字符串(以以#结束结束):); ch=getchar( ); / 接收从键盘输入的第一个

12、字符接收从键盘输入的第一个字符 while(ch!=#) / 当输入当输入#时结束循环时结束循环 fputc(ch,fp); / 向磁盘文件输出一个字符向磁盘文件输出一个字符 putchar(ch); / 将输出的字符显示在屏幕上将输出的字符显示在屏幕上 ch=getchar(); / 再接收从键盘输入的一个字符再接收从键盘输入的一个字符 fclose(fp); / 关闭文件关闭文件 putchar(10); / 输出换行,输出换行,ascii为为10 例例10.2 10.2 将一个磁盘文件中的信息复制到另一个磁盘将一个磁盘文件中的信息复制到另一个磁盘文件中。文件中。 今要求将上例建立的今要求

13、将上例建立的file1.datfile1.dat文件中的内文件中的内容复制到另一个磁盘文件容复制到另一个磁盘文件file2.datfile2.dat中。中。解题思路:解题思路:处理此问题的算法是:从处理此问题的算法是:从file1.datfile1.dat文件中逐个读入文件中逐个读入字符,然后逐个输出到字符,然后逐个输出到file2.datfile2.dat中。中。fgetc()fgetc()读取读取,fputc(),fputc()输出输出#include #include void main( ) FILE *in,*out; char ch,infile10,outfile10; prin

14、tf(输入读入文件的名字:); scanf(%s,infile); file1.datfile1.dat printf(输入输出文件的名字:); scanf(“%s”,outfile); filefile2 2.dat.dat if(in=fopen(infile,“r”)=NULL) printf(无法打开此文件n); exit(0); if(out=fopen(outfile,w)=NULL) / 打开输出文件 printf(无法打开此文件n); exit(0); while(!feof(in) / 如果未遇到输入文件的结束标志 ch=fgetc(in); / 从输入文件读入一个字符,暂放

15、在变量ch中 fputc(ch,out); / 将ch写到输出文件中 putchar(ch); / 将ch显示在屏幕上 putchar(10); / 显示完全部字符后换行 fclose(in); / 关闭输入文件 fclose(out); / 关闭输出文件 按文本文件方式处理,按文本文件方式处理,改为改为rb和和wb,则复制,则复制一个二进制文件一个二进制文件程序说明:程序说明: 用来指向文件的当前读写用来指向文件的当前读写字节字节 文件读写位置指针与文件指针的区别文件读写位置指针与文件指针的区别: 若读入若读入n-1个字符前遇换行符或文件尾(个字符前遇换行符或文件尾(EOF)即结束)即结束)

16、 例例10.3 从键盘读入若干个字符串,对它们按字母大从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文小的顺序排序,然后把排好序的字符串送到磁盘文件中保存。件中保存。 解题思路:为解决问题,可分为三个步骤:解题思路:为解决问题,可分为三个步骤:u从从键盘读入键盘读入n个字符串个字符串,存放在一个二维字符数组中,存放在一个二维字符数组中,每一个一维数组存放一个字符串;每一个一维数组存放一个字符串;u对字符数组中的对字符数组中的n个字符串按字母顺序排序,排好序的个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;字符串仍存放在字符数组中;u将字符数组中的字符

17、串顺序输出。将字符数组中的字符串顺序输出。知识点回顾知识点回顾 字符串处理函数字符串处理函数1、puts(字符数组):将一个字符串输出到终端。(字符数组):将一个字符串输出到终端。2、gets(字符数组):从终端输入一个字符串到字符数。(字符数组):从终端输入一个字符串到字符数。3、strcmp(字符串(字符串1,字符串,字符串2):字符串比较):字符串比较 字符串字符串1=字符串字符串2 函数值为函数值为0 字符串字符串1字符串字符串2 函数值为一正整数函数值为一正整数 字符串字符串1字符串字符串2 函数值为一负整数函数值为一负整数4、strcpy(字符数组字符数组1,字符串,字符串2):将

18、字符串:将字符串2复制到字符数复制到字符数组组1中。中。#include #include #include int main() FILE *fp; char str310,temp10; / str存放字符串二维数组,存放字符串二维数组,temp临时临时数组数组 int i,j,k,n=3; printf(Enter strings:n); / 提示输入字符串提示输入字符串 */ for(i=0;in;i+) gets(stri); / 输入字符串输入字符串 for(i=0;in-1;i+) / 用选择法(小到大)对字符串排序用选择法(小到大)对字符串排序 k=i; for(j=i+1;j

19、0) k=j; If(k!=i) strcpy(temp,stri); strcpy(stri,strk); strcpy(strk,temp); if(fp=fopen(D:CCstring.dat,w)=NULL) / 打开磁盘文件打开磁盘文件 printf(cant open file!n); exit(0); printf(nThe new sequence:n); for(i=0;in;i+) fputs(stri,fp); fputs(n,fp); printf(%sn,stri) / 在屏幕上显示字符串在屏幕上显示字符串 #include #include void main()

20、 FILE *fp; char str310; int i=0; if(fp=fopen(“D:CCstring.dat”,“r”)=NULL) printf(cant open file!n); exit(0); while(fgets(stri,10,fp)!=NULL) /若执行函数成功若执行函数成功 printf(%s,stri); i+; fclose (fp);不用人为地输出不用人为地输出n为了验证输出到磁盘文件中的内容,可以编写出以下的为了验证输出到磁盘文件中的内容,可以编写出以下的程序,从该文件中读回字符串,并在屏幕上显示。程序,从该文件中读回字符串,并在屏幕上显示。10.3.

21、3 文件的格式化读写文件的格式化读写一般调用方式为:一般调用方式为:fprintf(文件指针文件指针,格式字符串格式字符串,输出表列输出表列);fscanf (文件指针文件指针,格式字符串格式字符串,输入表列输入表列);pirntf、scanf数据格式化读写,数据格式化读写,fprintf、fscanf文件格式化读写文件格式化读写10.3.4 用二进制方式读写文件用二进制方式读写文件 一般调用形式为一般调用形式为:fread(buffer,size,count,fp);fwrite(buffer,size,count,fp); buffer:是一个地址:是一个地址u对对fread来说,它是读入

22、数据的存放地址来说,它是读入数据的存放地址u对对fwrite来说,是要输出数据的地址来说,是要输出数据的地址 size:要读写的字节数:要读写的字节数 count:要读写多少个数据项:要读写多少个数据项 fp:FILE类型指针类型指针例:例:fread(f,4,10,fp)读写数据块读写数据块从从fp指向的文件读入指向的文件读入10个个4字节的数据放入字节的数据放入f数组数组如果有一个如果有一个struct student 结构体类型结构体类型struct student char name【10】; int num; int age; char addr【30】; stud【40】; for

23、(i=0;i40;i+) fread(&studi, sizeof(struct student_type),1,fp); for(i=0;i40;i+) fwrite(&studi, sizeof(struct student_type),1,fp);假设学生的数据存放在磁盘文件中,可以用假设学生的数据存放在磁盘文件中,可以用for语句读入语句读入40个学生数据个学生数据用用for语句将内存中的学生数据输出到磁盘文件中语句将内存中的学生数据输出到磁盘文件中 例10.4 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件中。 #include #define SIZE 1

24、0struct student_type char name10; int num; int age; char addr15; studSIZE; void main() int i; printf(“enter data of students:n); for(i=0;iSIZE;i+) scanf(%s%d%d%s, ,&studi.num, &studi.age,studi.addr); save( );void save( ) FILE *fp; int i; if(fp=fopen(stu_dat,wb)=NULL) printf(cannot

25、open filen); exit(0); for(i=0;iSIZE;i+) if(fwrite(&studi, sizeof(struct student_type),1,fp)!=1) printf(file write errorn); fclose(fp);当前路径下的文件当前路径下的文件函数调用成功,返回函数调用成功,返回count的值的值#include #define SIZE 10struct student_type char name10; int num; int age; char addr15;studSIZE; void main( )int i; FIL

26、E *fp; if(fp=fopen(stu_dat,rb)=NULL) printf(cannot open filen); return; 为了验证为了验证在磁盘文在磁盘文件中是否件中是否已存在此已存在此数据,可数据,可以用以下以用以下程序从文程序从文件中读入件中读入数据,然数据,然后在屏幕后在屏幕上输出上输出 for(i=0;iSIZE;i+) fread (&studi,sizeof(struct student_type),1,fp); printf (“%-10s %4d %4d %-15sn”, ,studi.num, studi. age,studi

27、.addr); fclose (fp); 对使用文件类型的要求:对使用文件类型的要求: fgetc( )和和fputc( )函数主要对文本文件进行读写,但也可对二进制文函数主要对文本文件进行读写,但也可对二进制文件进行读写;件进行读写; fgets( )和和fputs( )函数主要对文本文件进行读写,对二进制文件操作函数主要对文本文件进行读写,对二进制文件操作无意义;无意义; fread( )和和fwrite( )函数主要对二进制文件进行读写,但也可对文本文函数主要对二进制文件进行读写,但也可对文本文件进行读写;件进行读写; fscanf( )和和fprintf( )函数主要对文本文件进行读写

28、,对二进制文件操函数主要对文本文件进行读写,对二进制文件操作无意义。作无意义。文件的随机读写文件的随机读写随机访问不是按数据在文件中的物理位置次序进行读写,随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多。比顺序访问效率高得多。顺序访问容易理解,但效率不高。是按数据在文件中的顺序访问容易理解,但效率不高。是按数据在文件中的物理位置次序进行读写物理位置次序进行读写例如:要查询在哈尔滨学院居住的一个女同学,按顺序访问的话例如:要查询在哈尔滨学院居住的一个女同学,按顺序访问的话从一号

29、寝室从一号寝室101寝室的第寝室的第1个床进行访问,操作容易,效率不高!个床进行访问,操作容易,效率不高!文件的随机读写文件的随机读写l 文件位置指针文件位置指针-指向当前读写位置的指针指向当前读写位置的指针l 读写方式读写方式 如何强制使位置指针指向指定的位置?如何强制使位置指针指向指定的位置? 解题思路:解题思路:1 1、有、有2 2个文件,需定义个文件,需定义2 2个文件指针变量,分别指向文件。个文件指针变量,分别指向文件。2 2、将内容显示在屏幕上,需要调用、将内容显示在屏幕上,需要调用putcharputchar函数。函数。注意注意:1 1、在第一次读入完文件内容后,位置指针指到文件

30、的末尾,、在第一次读入完文件内容后,位置指针指到文件的末尾,如果再接着读数据,就遇到文件结束标志,如果再接着读数据,就遇到文件结束标志,feoffeof函数的函数的值等于值等于1(1(真真) ),无法再读数据。,无法再读数据。2 2、必须在程序中用必须在程序中用rewindrewind函数使位置指针返回文件开头函数使位置指针返回文件开头 例例10.5 10.5 有一个磁盘文件,第一次将它的内容显示在有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另一文件上。屏幕上,第二次把它复制到另一文件上。#includeint main() FILE *fp1,*fp2; fp1=fopen

31、(file1.dat,r); / 打开输入文件打开输入文件 fp2=fopen(file2.dat,w); / 打开输出文件打开输出文件 while(!feof(fp1) putchar(getc(fp1); / 逐个读入字符并输出到屏幕逐个读入字符并输出到屏幕 putchar(10); / 输出一个换行输出一个换行 rewind(fp1); / 使文件位置指示器返回文件头使文件位置指示器返回文件头 while(!feof(fp1) putc(getc(fp1),fp2); / 从文件头重新逐个读字符,从文件头重新逐个读字符, 输出到输出到file2文件文件 fclose(fp1);fclose(fp2); 例例10.5 10.5 有一个磁盘文件,第一次将它的内容显示在屏幕上,第有一个磁盘文件,第一次将它的内容显示在屏幕上,第二次把它复制到另外一个文件上二次把它复制到另外一个文件上 fseek:用:用fseek函数移动位置指针函数移动位置指针fseek函数一般用于二进制文件。位移量应是函数一般用于二进制文件。位移量应是long型数据型数据(在数字的末尾加一个字母在数字的末尾加一个字母L)下面是下面是fseek函数调用的几个例子:函数调用的几个例子: ufsee

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论