第10章 C语言文件_第1页
第10章 C语言文件_第2页
第10章 C语言文件_第3页
第10章 C语言文件_第4页
第10章 C语言文件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1010章章 C C语言文件语言文件下一页下一页返返 回回本章要点本章要点文件的概念文件的概念文件指针文件指针文件打开与关闭文件打开与关闭文件读写操作文件读写操作文件定位文件定位学习方法建议学习方法建议 学习本章内容时,首先要理解文件的概念及分类,然学习本章内容时,首先要理解文件的概念及分类,然后掌握文件指针及文件位置指针的区别,在此基础上学习后掌握文件指针及文件位置指针的区别,在此基础上学习文件的打开与关闭及文件的读写方法。文件的打开与关闭及文件的读写方法。 对语法点要加以记对语法点要加以记忆并多上机练习。忆并多上机练习。目目 录录10.110.1 文件概述文件概述10.210.2 文件

2、的打开与关闭文件的打开与关闭10.310.3 文件的读写操作文件的读写操作返返 回回上一页上一页10.510.5 文件应用举例文件应用举例 10.410.4 文件定位文件定位 10.610.6 本章小结本章小结 10.1 文件概述文件概述下一页下一页返返 回回 1文件的概念文件的概念 文件是程序设计中一个重要的概念。所谓文件,是指存储在外部介质文件是程序设计中一个重要的概念。所谓文件,是指存储在外部介质上数据的集合。数据是以文件的形式存放在外部介质上(如磁盘);计算机上数据的集合。数据是以文件的形式存放在外部介质上(如磁盘);计算机操作系统是以文件为单位对数据进行管理。也就是说,如果想找存在外

3、部介操作系统是以文件为单位对数据进行管理。也就是说,如果想找存在外部介质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数质上的数据,必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它写数据。能向它写数据。 2文件的类型文件的类型 从不同的角度可以将文件划分成不同的类型。从不同的角度可以将文件划分成不同的类型。 (1)按文件存储内容,文件可分为源程序文件和数据文件。)按文件存储内容,文件可分为源程序文件和数据文件。源程序文件存放的是程序代码

4、,数据文件是程序中的数据的集合。本书中前源程序文件存放的是程序代码,数据文件是程序中的数据的集合。本书中前面章节中讲述的文件均为源程序文件,本章所介绍的文件多为数据文件。面章节中讲述的文件均为源程序文件,本章所介绍的文件多为数据文件。 (2)按文件存取方式,文件可分为顺序文件和随机文件。)按文件存取方式,文件可分为顺序文件和随机文件。 顺序文件顾名思义总是从文件的开头顺序读或者写,也就是按文件的顺序文件顾名思义总是从文件的开头顺序读或者写,也就是按文件的字节顺序进行,而随机文件可以指定读写位置,并对该位置上的数据直接进字节顺序进行,而随机文件可以指定读写位置,并对该位置上的数据直接进行读写操作

5、。行读写操作。 (3)按文件的数据组织方式,文件可分为文本文件和二进制文件。)按文件的数据组织方式,文件可分为文本文件和二进制文件。 文本文件(也称文本文件(也称ACSII文件)是指文件中的字符以其文件)是指文件中的字符以其ASCII码的形式存储码的形式存储在文件中,文件中的每个字符占在文件中,文件中的每个字符占1个字节。如整型数据个字节。如整型数据12345在内存中占在内存中占4个字个字节,而如果以文本文件形式存储则占节,而如果以文本文件形式存储则占5个字节。所以文本文件中的数据读入内个字节。所以文本文件中的数据读入内存处理时,需要将其从文件中数据的存储形式转换为内存中的存储形式。存处理时,

6、需要将其从文件中数据的存储形式转换为内存中的存储形式。 二进制文件是指数据以其在内存中的存放形式存储到文件中。整型数据在二进制文件是指数据以其在内存中的存放形式存储到文件中。整型数据在内存中占内存中占4个字节,如果将整型数据存储到二进制文件中,该数据还占个字节,如果将整型数据存储到二进制文件中,该数据还占4个字节。个字节。所以将二进制文件中的数据读入内存处理时,不需要中间转换。由此可见,二所以将二进制文件中的数据读入内存处理时,不需要中间转换。由此可见,二进制文件节省存储空间而存取速度比文本文件的存取速度快。进制文件节省存储空间而存取速度比文本文件的存取速度快。 3.文件指针文件指针 在对文件

7、进行打开、读写及关闭操作时,需要借助文件指针来完成。在对文件进行打开、读写及关闭操作时,需要借助文件指针来完成。 文件指针是指向结构体类型的指针,该结构体类型由系统定义,取名文件指针是指向结构体类型的指针,该结构体类型由系统定义,取名FILE,其中存放着文件的名字、文件状态、文件大小以及文件位置等信息。程,其中存放着文件的名字、文件状态、文件大小以及文件位置等信息。程序中可以用序中可以用FILE类型定义指针变量,以指向文件,定义的一般形式为:类型定义指针变量,以指向文件,定义的一般形式为: FILE *指针变量;指针变量; 例如:例如:FILE *fp; fp是指向是指向FILE结构体类型的变

8、量,该变量可以用来存放某个文件信息,结构体类型的变量,该变量可以用来存放某个文件信息,因此称文件指针。文件的访问必须通过文件的指针来完成,定义文件指针时必因此称文件指针。文件的访问必须通过文件的指针来完成,定义文件指针时必须包含头文件须包含头文件“stdio.h。 上一页上一页下一页下一页返返 回回上一页上一页下一页下一页返返 回回文件打开操作使用库函数文件打开操作使用库函数fopen( )来完成。来完成。fopen( )函数调用的一般形式:函数调用的一般形式:文件指针文件指针=fopen(文件名,文件使用方式);(文件名,文件使用方式);若打开成功,该函数返回一个指向若打开成功,该函数返回一

9、个指向FILE类型的指针;否则返回类型的指针;否则返回0(NULL)。)。如:如:FILE *fp;fp=fopen(filename,r); /* 以读方式打开以读方式打开“filename”文件,并使文件,并使fp指向指向该文件该文件 */为了确保能正确使用被打开的文件,一般采用以下程序段来打开文件:为了确保能正确使用被打开的文件,一般采用以下程序段来打开文件:if(fp=fopen(filename,mode)= =NULL) /*打开打开filename文件,文件,mode是使用方式是使用方式*/ printf(Can not open this file!n); exit(0); /

10、* 打开文件不成功,强制退出程序打开文件不成功,强制退出程序 */文件名是一个合法的字符串。文件名是一个合法的字符串。文件使用方式为读或写,常用的文件使用方式如表文件使用方式为读或写,常用的文件使用方式如表10.1所示。所示。10.2 文件的打开与关闭文件的打开与关闭10.2.1 文件的打开文件的打开上一页上一页下一页下一页返返 回回使用方式使用方式含含 义义文本文文本文件件二进制文二进制文件件rrb读方式。要求打开的文件必须存在读方式。要求打开的文件必须存在wwb写方式。新建一个文件,不论该打开的文件是否存在写方式。新建一个文件,不论该打开的文件是否存在aab追加方式。(追加方式。(1)若打

11、开的文件存在,则从文件尾追加数据,原有内容保留)若打开的文件存在,则从文件尾追加数据,原有内容保留(2)若打开的文件不存在,则建立该文件)若打开的文件不存在,则建立该文件r+rb+读写方式。要求打开的文件必须存在,且可读可写读写方式。要求打开的文件必须存在,且可读可写(1)r+:从起始位置开始读写,写数据时,只覆盖占用空间,其它不变:从起始位置开始读写,写数据时,只覆盖占用空间,其它不变(2)rb+:可以由指定位置开始读写,其它与文本文件相同:可以由指定位置开始读写,其它与文本文件相同w+wb+读写方式。首先建立新文件,进行写操作,随后再读。若文件存在,则原读写方式。首先建立新文件,进行写操作

12、,随后再读。若文件存在,则原内容消失内容消失(1)w+:从起始位置开始读:从起始位置开始读 (2)wb+:可以由指定位置开始读:可以由指定位置开始读a+ab+追加读写方式。与追加读写方式。与“a”和和 “ab”相同,但追加数据后,可以从头读相同,但追加数据后,可以从头读(“a+”),或从指定位置开始读(),或从指定位置开始读(“ab+”)表表10.1 文件的使用方式文件的使用方式 在使用完一个文件后应该关闭它,以防止它再被误用。在使用完一个文件后应该关闭它,以防止它再被误用。“关闭关闭”就是就是使文件指针变量不指向该文件,也就是文件指针变量与文件使文件指针变量不指向该文件,也就是文件指针变量与

13、文件“脱钩脱钩”,以后,以后不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,不能再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。使该指针变量重新指向该文件。 用用fclose函数关闭文件。函数关闭文件。fclose函数调用的一般形式为:函数调用的一般形式为: fclose(文件指针)(文件指针); 例如:例如: fclose(fp); 前面我们曾把打开文件(用前面我们曾把打开文件(用fopen函数)时所带回的指针赋给了函数)时所带回的指针赋给了fp,今,今通过通过fp把该文件关闭。即把该文件关闭。即fp不再指向该文件。不再指向该文件。

14、应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会丢失数应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件将会丢失数据。据。 fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为函数也带回一个值,当顺利地执行了关闭操作,则返回值为0;否则返回否则返回EOF(-1)。)。上一页上一页下一页下一页返返 回回10.2.2 文件的关闭文件的关闭上一页上一页下一页下一页返返 回回 1字符写函数字符写函数(fputc( )或或putc( )一般调用形式为:一般调用形式为:fputc(ch,fp);其中其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。是要输出的

15、字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针。是文件指针。fputc(ch,fp)函数的作用是将字符函数的作用是将字符ch的值输出到的值输出到fp所指向的所指向的文件中去。文件中去。2字符读函数字符读函数(fgetc( )或或getc( )一般调用形式为:一般调用形式为:ch=fgetc(fp);fp为文件指针,为文件指针,ch为字符变量。为字符变量。 fgetc函数带回一个字符,赋给函数带回一个字符,赋给ch。3文件结束标志文件结束标志(1)EOF。EOF是在是在stdio.h文件中定义的符号常量,值为文件中定义的符号常量,值为-1。是文本文件。是文本文件的结束标志。的结

16、束标志。如果在执行如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标函数读字符时遇到文件结束符,函数返回一个文件结束标志志EOF。10.3 文件的读写操作文件的读写操作10.3.1 字符的读写操作字符的读写操作(2)feof(fp)。对于二进制文件可以用)。对于二进制文件可以用feof(fp)函数来测试)函数来测试fp所指向的所指向的文件当前状态是否文件当前状态是否“文件结束文件结束”。如果是文件结束,函数。如果是文件结束,函数feof(fp)的值为)的值为1(真),否则为(真),否则为0(假)。这个函数也适用于文本文件。(假)。这个函数也适用于文本文件。【例【例10.1】

17、 从键盘输入一些字符,逐个把它们存入文件中,直到输入一个从键盘输入一些字符,逐个把它们存入文件中,直到输入一个“#”为止。为止。【编程思路【编程思路】(1)定义一个字符型数组,用来存放文件名,再定义一个字符型变量,用来)定义一个字符型数组,用来存放文件名,再定义一个字符型变量,用来接收从键盘输入的字符。接收从键盘输入的字符。(2)定义一个文件类型指针,使其和打开的文件相关联。打开方式为)定义一个文件类型指针,使其和打开的文件相关联。打开方式为w。(3)通过循环建立文件,即把输入的字符逐个写入文件中。)通过循环建立文件,即把输入的字符逐个写入文件中。上一页上一页下一页下一页返返 回回【程序代码【

18、程序代码】#includemain( ) FILE *fp; char ch,filename10; scanf(%s,filename); if(fp=fopen(filename,w)= =NULL) printf(“can not open filen); exit(0); ch=getchar( ); /*接收输入的第一个字符接收输入的第一个字符*/ while (ch!=#) fputc(ch,fp);putchar(ch); ch=getchar( ); fclose(fp);运行结果如下:运行结果如下:上一页上一页下一页下一页返返 回回【例【例10.2】 将一个磁盘文件中的信息复

19、制到另一个磁盘文件中。将一个磁盘文件中的信息复制到另一个磁盘文件中。【编程思路【编程思路】(1)定义两个文件类型指针,分别和源文件及目标文件关联,打开这两个文)定义两个文件类型指针,分别和源文件及目标文件关联,打开这两个文件时分别使用件时分别使用r和和w方式。方式。(2)从通过循环不断从源文件读字符并写入目标文件,循环条件是源文件没)从通过循环不断从源文件读字符并写入目标文件,循环条件是源文件没有结束。有结束。【程序代码【程序代码】#includemain( ) FILE *in,*out;char infile10,outfile10;printf(Enter the infile name

20、:n);scanf(%s,infile);printf(Enter the outfile name:n);scanf(%s,outfile);上一页上一页下一页下一页返返 回回if(in=fopen(infile, r)=NULL) printf(cannot open infilen); exit(0);if(out=fopen(outfile, w)=NULL) printf(cannot open outfilen); exit(0);while(!feof(in) fputc(fgetc(in),out);fclose(in);fclose(out);运行结果如下:运行结果如下:上一

21、页上一页下一页下一页返返 回回1字符串写函数字符串写函数(fputs( )fputs函数用来把字符串输出到文件中,一般调用形式为:函数用来把字符串输出到文件中,一般调用形式为:fputs(str,fp);此处,此处,fp是文件指针,是文件指针,str是待输出字符串,可以是字符串常量、字符数组是待输出字符串,可以是字符串常量、字符数组名或字符型指针。用此函数进行输出时,字符串中最后的名或字符型指针。用此函数进行输出时,字符串中最后的0并不输出,也并不输出,也不自动加不自动加n。2.字符串读函数字符串读函数(fgets( )fgets的作用是从指定文件读入一个字符串。一般调用形式为:的作用是从指定

22、文件读入一个字符串。一般调用形式为:fgets(str,n,fp);此处,此处,fp为文件指针,为文件指针,str是存放字符串的起始地址,是存放字符串的起始地址,n为要求得到字符数为要求得到字符数量,是一个整型变量。函数的功能是从量,是一个整型变量。函数的功能是从fp指向的文件中读指向的文件中读n-1个字符放入个字符放入str为起始地址的存储单元中,然后系统将在最后自动加一个为起始地址的存储单元中,然后系统将在最后自动加一个0字符,如字符,如果在读完果在读完n-1个字符之前遇到换行符或个字符之前遇到换行符或EOF,读入即结束。,读入即结束。fgets函数返回函数返回值为值为str的首地址。的首

23、地址。上一页上一页下一页下一页返返 回回10.3.2 字符串读写操作字符串读写操作【例【例10.3】 编写程序,从键盘输入三行字符,并存入文件编写程序,从键盘输入三行字符,并存入文件ss.txt中,再将中,再将ss.txt中的内容读出来显示在屏幕上。中的内容读出来显示在屏幕上。【程序代码【程序代码】#include main( )int i; char str81;FILE *fp; fp=fopen(ss.txt,w); if (fp=NULL) puts(无法打开文件!无法打开文件!n); exit(0); puts(please input the string :n);for(i=0;

24、i3;i+) gets(str); 上一页上一页下一页下一页返返 回回fputs(str,fp); fputs(n,fp); fclose(fp); puts(content of the file is:n);if (fp=fopen(ss.txt,r)=NULL) printf(无法打开文件!无法打开文件!n);exit(0); while(fgets(str,81,fp)!=NULL)printf(%s,str);fclose(fp); 运行结果如下:运行结果如下:上一页上一页下一页下一页返返 回回10.3.3 数据块读写操作数据块读写操作二进制文件存储信息的形式与内存中存储信息的形式是

25、一致的,如果需要二进制文件存储信息的形式与内存中存储信息的形式是一致的,如果需要在内存与磁盘文件之间频繁交换数据,最好采用二进制文件。在内存与磁盘文件之间频繁交换数据,最好采用二进制文件。二进制文件一般是同类型数据的集合,每个数据所占字节数是一个固定值,二进制文件一般是同类型数据的集合,每个数据所占字节数是一个固定值,因此二进制文件除了可以顺序存取外,还可以运用定位函数方便地进行随因此二进制文件除了可以顺序存取外,还可以运用定位函数方便地进行随机存取。机存取。 二进制文件的读写操作可用数据块读写函数二进制文件的读写操作可用数据块读写函数fwrite( )和和fread( )完成。完成。1.块写

26、函数块写函数(fwrite( )fwrite( )函数的作用是把一组数据输出到指定的磁盘文件中。一般调用形式为:函数的作用是把一组数据输出到指定的磁盘文件中。一般调用形式为:fwrite(buffer,size,count,fp);其中,其中,buffer为一个指针,为要输出数据的首地址,为一个指针,为要输出数据的首地址,size为要写数据块的字为要写数据块的字节数,节数,count为要写数据块的个数,为要写数据块的个数,fp为文件类型指针。例如:为文件类型指针。例如:fwrite(fa,4,5,fp);其作用是将其作用是将fa指向的存储区中指向的存储区中5个个4B(即(即1个整型数据或单精度

27、实型数据)大个整型数据或单精度实型数据)大小的数据项写入小的数据项写入fp所指向的文件中。所指向的文件中。2.块读函数块读函数(fread( ) )fread( )函数的作用是从指定的磁盘文件中读取一组数据,并存放到指定的存函数的作用是从指定的磁盘文件中读取一组数据,并存放到指定的存储区域。一般调用形式为:储区域。一般调用形式为:fread(buffer,size,count,fp);其中,其中,buffer为一个指针,是读入数据的存放地址,为一个指针,是读入数据的存放地址, size为要读数据块的字为要读数据块的字节数,节数,count为要读数据块的个数,为要读数据块的个数,fp为文件类型指

28、针。例如:为文件类型指针。例如:fread(fa,4,5,fp);其作用是从其作用是从fp所指文件中,读取所指文件中,读取5个个4B大小的数据,存入大小的数据,存入fa所指存储区中。所指存储区中。上一页上一页下一页下一页返返 回回【例【例10.4】 从键盘输入两个学生信息(包括姓名、编号、年龄及地址),从键盘输入两个学生信息(包括姓名、编号、年龄及地址),存入一个二进制文件中,然后再读出这两个学生的信息显示在屏幕上。存入一个二进制文件中,然后再读出这两个学生的信息显示在屏幕上。【程序代码【程序代码】#includestruct stu char name10;int num;int age;c

29、har addr15;boya2,boyb2,*pp,*qq; main()FILE *fp;int i;pp=boya;qq=boyb;if(fp=fopen(stu_list,wb+)=NULL)printf(文件不能打开文件不能打开!);exit(0);上一页上一页下一页下一页返返 回回printf(n请输入两个学生信息:请输入两个学生信息:n);for(i=0;iname,&pp-num,&pp-age,pp-addr);pp=boya; fwrite(pp,sizeof(struct stu),2,fp); rewind(fp);fread(qq,sizeof(str

30、uct stu),2,fp); printf(-n);printf(nn姓名姓名t编号编号 年龄年龄 地址地址n);for(i=0;iname,qq-num,qq-age,qq-addr);fclose(fp);运行结果如下:运行结果如下:上一页上一页下一页下一页返返 回回fscanf( ) 和和fprintf( )函数是格式化读写函数,其读写对象是磁盘文件,格函数是格式化读写函数,其读写对象是磁盘文件,格式化读写函数只适用于文本文件,不适用于二进制文件。式化读写函数只适用于文本文件,不适用于二进制文件。 fscanf( )和和fprintf( ) 函数与函数与scanf( ) 和和print

31、f( )函数的格式控制部分相同。函数的格式控制部分相同。1格式化写函数格式化写函数(fprintf( )fprintf( )函数的作用是将函数的作用是将“输出表列输出表列”中所指出的变量中数据经过转换后中所指出的变量中数据经过转换后写到文件中去。该函数的一般格式是:写到文件中去。该函数的一般格式是:fprintf(文件类型指针文件类型指针, 格式控制字符串格式控制字符串,输出表列,输出表列);例如:例如:fprintf(fp,%d,%6.2f,i,t);它的作用是将整形变量它的作用是将整形变量i和实型变量和实型变量t的值按的值按%d和和%6.2f的格式输出到的格式输出到fp指指向的文件上。如果

32、向的文件上。如果i=3,t=4.5则输出到磁盘文件上的是以下的内容:则输出到磁盘文件上的是以下的内容:3,4.50上一页上一页下一页下一页返返 回回10.3.4 格式化读写操作格式化读写操作上一页上一页下一页下一页返返 回回2.格式化读函数格式化读函数(fscanf( )fscanf( )函数的作用是从文件中将数据按指定格式读到有关地址内存存储区。函数的作用是从文件中将数据按指定格式读到有关地址内存存储区。该函数的一般格式是:该函数的一般格式是:fscanf(文件类型指针文件类型指针, 格式控制字符串格式控制字符串,地址表列,地址表列);例如:例如:fscanf(fp,%d,%f,&i

33、,&t);磁盘文件上如果有以下字符:磁盘文件上如果有以下字符:3,4.500000则将磁盘文件中的数据则将磁盘文件中的数据3送给变量送给变量i,4.5送给变量送给变量t。【例【例10.5】 把两个整数写入文件中,再从文件中读出来并求和,输出此和把两个整数写入文件中,再从文件中读出来并求和,输出此和值。值。【程序代码【程序代码】#include main( )int a,b,c,d,s=0; FILE *fp; fp=fopen(file1.dat,w+); scanf(%d%d,&a,&b);fprintf(fp, %d %d,a,b); rewind(fp);fsca

34、nf(fp, %d%d,&c,&d); s=c+d; printf(s=%dn,s); fclose(fp); 运行结果如下:运行结果如下:文件中的读写位置指针,在读写一个文件时,每次执行一个读写操作后,将文件中的读写位置指针,在读写一个文件时,每次执行一个读写操作后,将自动移动到下一个待读写的位置。如果想改变这样的规律,强制使位置指针自动移动到下一个待读写的位置。如果想改变这样的规律,强制使位置指针指向某一指定的位置,可以使用下面一些相关函数。指向某一指定的位置,可以使用下面一些相关函数。1移动文件位置指针函数移动文件位置指针函数(fseek( )fseek( )函数调用的一

35、般形式:函数调用的一般形式:fseek(fp,offset,origin);功能:将文件的位置指针从某处移动到指定的位置,接着的读写操作即从该功能:将文件的位置指针从某处移动到指定的位置,接着的读写操作即从该位置开始。位置开始。说明:说明:(1)fp是待操作的文件指针;是待操作的文件指针;(2)offset是以字节为单位的位移量,为是以字节为单位的位移量,为long型,当型,当offset0时,位置指针时,位置指针向文件尾方向移动,当向文件尾方向移动,当offset0,位置指针向文件首方向移动;,位置指针向文件首方向移动;(3)origin是位置指针移动的起始点,它可以用数字表示,也可用符号常

36、量是位置指针移动的起始点,它可以用数字表示,也可用符号常量表示,取值如下:表示,取值如下:文件开始文件开始 0 或或 SEEK_SET文件当前位置文件当前位置 1 或或 SEEK_CUR文件末尾文件末尾 2 或或 SEEK_END上一页上一页下一页下一页返返 回回10.4 文件定位文件定位上一页上一页下一页下一页返返 回回(4)fseek函数一般用于二进制文件,因为文本文件要发生字符转换,计函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。算位置时往往会发生混乱。如:如:fseek(fp,20L,SEEK_SET); /*文件位置指针从文件首部向后移动文件位置指针从

37、文件首部向后移动20个字节个字节*/fseek(fp,-30L,SEEK_END); /*文件位置指针从文件尾向前移动文件位置指针从文件尾向前移动30个字节个字节*/2获取文件位置指针值函数获取文件位置指针值函数(ftell( )ftell( )函数调用的一般形式:函数调用的一般形式:t=ftell(fp);功能:获取功能:获取fp所指文件的位置指针值,即距文件首的字节数,它是所指文件的位置指针值,即距文件首的字节数,它是long型型数据。数据。说明:说明:fp是待操作的文件指针;是待操作的文件指针;t是是long型变量,用来存放型变量,用来存放ftell函数的返回函数的返回值,当函数调用成功

38、时,返回位置值,失败时,返回值,当函数调用成功时,返回位置值,失败时,返回-1L。如:测试文件长度如:测试文件长度fseek(fp,0L,SEEK_END); /*将位置指针移到文件尾将位置指针移到文件尾*/t=ftell(fp); /*获取文件长度(字节数)获取文件长度(字节数)*/上一页上一页下一页下一页返返 回回3文件位置指针返回文件首函数文件位置指针返回文件首函数(rewind( )rewind( )函数调用的一般形式:函数调用的一般形式:rewind(fp);功能:使功能:使fp所指文件的位置指针返回到文件首部。所指文件的位置指针返回到文件首部。说明:说明:fp是待操作的文件指针;该

39、函数没有返回值。又称是待操作的文件指针;该函数没有返回值。又称“返绕返绕”函数。函数。【例【例10.6】 向文件中存入向文件中存入5个学生的数据(包括姓名、学号、年龄)。然后个学生的数据(包括姓名、学号、年龄)。然后从文件中读出第从文件中读出第1、3、5个学生的数据,并在屏幕上显示出来。个学生的数据,并在屏幕上显示出来。【程序代码【程序代码】#includestruct student_type char name10; int num; int age; stu5;上一页上一页下一页下一页返返 回回main( ) int i; FILE *fp; if(fp=fopen(stud_dat,w

40、b+)=NULL) printf(can not open filen); exit(0); for(i=0;i5;i+) scanf(%s%d%d,,&stui.num,&stui.age); fwrite(&stui,sizeof(struct student_type),1,fp); rewind(fp); printf(-n); for(i=0;i5;i+=2) fseek(fp,i*sizeof(struct student_type),0); fread(&stui,sizeof(struct student_type),1,fp)

41、; printf(%s%t%dt%dn,,stui.num,stui.age);fclose(fp);上一页上一页下一页下一页返返 回回运行结果如下:运行结果如下:10.5 文件应用举例文件应用举例【例【例10.7】从键盘输入】从键盘输入5个整数到二进制文件中,然后修改文件中的第个整数到二进制文件中,然后修改文件中的第3个个数为原来的数为原来的4倍,并保存到文件中,输出修改后文件的内容。倍,并保存到文件中,输出修改后文件的内容。【编程思路【编程思路】(1)定义四个函数,分别用来写数据、读数据和修改数据,主函数调用)定义四个函数,分别用来写数据、读数据和修改数据,主函数调用这些

42、函数。这些函数。(2)修改函数中,通过定位函数)修改函数中,通过定位函数fseek(),使文件位置指针指向要修改的,使文件位置指针指向要修改的数据,读出后确认需修改,则重新输入要修改的数据,再写回文件即可。数据,读出后确认需修改,则重新输入要修改的数据,再写回文件即可。上一页上一页下一页下一页返返 回回【程序代码【程序代码】#include stdio.h#define N 5void mywrite(int *p);void myread(int *p);void mymodify( );main()int i,numN;printf(n请输入请输入5个数据个数据: );for(i=0;iN

43、;i+)scanf(%d,&numi); mywrite(num);printf(n文件中的原始数据为文件中的原始数据为:n);myread(num);mymodify(); printf(n修改后的文件数据为修改后的文件数据为:n);myread(num);void mywrite(int *p) FILE *fp;int *q;fp=fopen(list,wb);for(q=p;qp+N;q+) fwrite(q,4,1,fp);fclose(fp);void myread(int *p) FILE *fp;int *q;fp=fopen(list,rb);for(q=p;qp+N

44、;q+) fread(q,4,1,fp);printf(%3d,*q);printf(nn);fclose(fp);上一页上一页下一页下一页返返 回回void mymodify( ) FILE *fp;int a=0;fp=fopen(list,rb+);fseek(fp,2*4,SEEK_SET); /*定位到第定位到第3个数的位置个数的位置*/fread(&a,4,1,fp); printf(n第第3个数是个数是: %dn,a);a*=4;fseek(fp,-4,SEEK_CUR); /*重新定位到第重新定位到第3个数的位置个数的位置*/fwrite(&a,4,1,fp);

45、 /*将数据写入文件将数据写入文件*/fclose(fp);运行结果如下:运行结果如下: 上一页上一页下一页下一页返返 回回【例【例10.8】 有有N个学生,每个学生有个学生,每个学生有3门课的成绩,从键盘输入学生数据门课的成绩,从键盘输入学生数据(包包括学号、姓名、括学号、姓名、3门课成绩门课成绩),计算出平均成绩,并把学生的所有数据存放在磁,计算出平均成绩,并把学生的所有数据存放在磁盘文件盘文件stud中。并显示文件中的信息。中。并显示文件中的信息。【编程思路【编程思路】(1)定义一个结构体类型,包括学号、姓名和用来存放学生成绩的数组,存)定义一个结构体类型,包括学号、姓名和用来存放学生成

46、绩的数组,存放均值的成员。再定义两个该结构体类型的数组。一个数组用来存放原始数放均值的成员。再定义两个该结构体类型的数组。一个数组用来存放原始数据及均值,并将此数组中的值写入文件中。据及均值,并将此数组中的值写入文件中。(2)从文件中读数据到另一个数组中,打印该数组。)从文件中读数据到另一个数组中,打印该数组。【程序代码【程序代码】#include stdio.h #define N 3struct student char num6;char name10; int score3; float avr; stuN,sN; 上一页上一页下一页下一页返返 回回main() int i,sum;

47、FILE *fp; for(i=0;iN;i+) printf(nplease input No.%d score:n,i+1); printf(stuNo: );scanf(%s,stui.num); printf(name: );scanf(%s,);sum=0; printf(score: ); scanf(%d%d%d,&stui.score0,&stui.score1,&stui.score2); sum+=stui.score0+stui.score1+stui.score2; stui.avr=sum/3.0; fp=fopen(stud

48、,wb); for(i=0;iN;i+) fwrite(&stui,sizeof(struct student),1,fp); fclose(fp); 上一页上一页下一页下一页返返 回回fp=fopen(stud,rb); for(i=0;iN;i+) fread(&si,sizeof(struct student),1,fp); printf(-n); printf(No.tNametScore1tScore2tScore3taveragen);for(i=0;iN;i+)printf(%st%st,si.num,);printf(%dt%dt%dt%.2fnn,si.score0,si.score1,si.score2,si.avr

温馨提示

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

评论

0/150

提交评论