《C语言程序设计 第10章 文件.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计 第10章 文件.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C C语言程序设计语言程序设计第第1010章章 文文 件件C C语言程序设计语言程序设计10.1 10.1 文件概述文件概述 10.2 10.2 文件的打开与关闭文件的打开与关闭 10.3 10.3 文件的读写操作文件的读写操作 第第第第10101010 章章章章 文文文文件件件件目录目录10.4 10.4 文件的定位文件的定位 10.5 10.5 出错检测出错检测 10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计10.1 10.1 文件概述文件概述 10.1.1 10.1.1 C C语言操作文件语言操作文件 10.1.2 10.1.2 文件类型指针文件类型指针 C C语言
2、程序设计语言程序设计10.1 10.1 文件概述文件概述 2 2文件的分类文件的分类 10.1.1 C10.1.1 C语言操作文件语言操作文件 n n从文件数据的组织形式来看,从文件数据的组织形式来看,C C语言把文件语言把文件分为分为ASCIIASCII文件和二进制文件。文件和二进制文件。n n文件(文件(filefile)是指计算机外部存储介质)是指计算机外部存储介质(磁盘、磁带等)上建立的一组有序的数(磁盘、磁带等)上建立的一组有序的数据集合,是数据的一种组织形式。据集合,是数据的一种组织形式。1 1文件的概念文件的概念 C C语言程序设计语言程序设计10.1 10.1 文件概述文件概述
3、 10.1.1 C10.1.1 C语言操作文件语言操作文件 3 3文件的处理方式文件的处理方式 n nC C语言编译系统提供两种文件处理方式:即语言编译系统提供两种文件处理方式:即“缓冲文件系统缓冲文件系统”和和“非缓冲文件系统非缓冲文件系统”。n例如:用例如:用C C语言书写的源程序文件,用语言书写的源程序文件,用Microsoft Office WordMicrosoft Office Word程序创建的文件是文程序创建的文件是文本文件,本文件,C C 程序的目标文件和可执行文件是程序的目标文件和可执行文件是二进制文件。二进制文件。C C语言程序设计语言程序设计10.1 10.1 文件概述
4、文件概述 10.1.1 C10.1.1 C语言操作文件语言操作文件 内存外存数据区输出缓冲区输入缓冲区磁盘n“缓冲文件系统缓冲文件系统”在对文件操作时,系统在对文件操作时,系统自动开辟一个内存缓冲区来输入和输出数据。自动开辟一个内存缓冲区来输入和输出数据。C C语言程序设计语言程序设计10.1 10.1 文件概述文件概述 10.1.2 10.1.2 文件类型指针文件类型指针 n n文件指针具体申明如下:文件指针具体申明如下:文件指针具体申明如下:文件指针具体申明如下:typedef struct typedef struct int _fd;int _fd;/*/*文件号文件号文件号文件号*/
5、*/int _cleft;int _cleft;/*/*缓冲区剩余字节数缓冲区剩余字节数缓冲区剩余字节数缓冲区剩余字节数*/*/int _mode;int _mode;/*/*文件操作模式文件操作模式文件操作模式文件操作模式*/*/char *_nextc;/*char *_nextc;/*下一个字节地址下一个字节地址下一个字节地址下一个字节地址*/*/char *_buff;/*char *_buff;/*文件缓冲区起始地址文件缓冲区起始地址文件缓冲区起始地址文件缓冲区起始地址*/*/FILE;FILE;n n注意:当对文件操作时,应首先定义文件注意:当对文件操作时,应首先定义文件指针变量,
6、如:指针变量,如:FILE*fp;C C语言程序设计语言程序设计10.2 10.2 文件的打开与关闭文件的打开与关闭 10.2.1 10.2.1 文件打开(文件打开(fopenfopen函数)函数)10.2.2 10.2.2 文件的关闭(文件的关闭(fclosefclose函数)函数)C C语言程序设计语言程序设计10.2 10.2 文件的打开与关闭文件的打开与关闭 在对文件进行操作时,都必须遵循以下三个在对文件进行操作时,都必须遵循以下三个步骤:步骤:(1)(1)打开文件。打开文件。(2)(2)文件处理文件处理(包括读文件,写文件等包括读文件,写文件等)。(3)(3)关闭文件。关闭文件。这三
7、个步骤的实现都是通过标准库函数实现这三个步骤的实现都是通过标准库函数实现的。的。C C语言程序设计语言程序设计10.2 10.2 文件的打开与关闭文件的打开与关闭 10.2.1 10.2.1 文件打开(文件打开(fopenfopen函数)函数)nfopen()函数调用形式为:函数调用形式为:FILE*fp;fp=fopen(文件名,操作方式文件名,操作方式);n n例如:例如:例如:例如:fp=fopen(“c:myfile.dat”,“r”);fp=fopen(“c:myfile.dat”,“r”);n n说明:如果文件的打开操作成功,则返回说明:如果文件的打开操作成功,则返回类型为指向类型
8、为指向FILEFILE类型的指针并赋值给指针类型的指针并赋值给指针变量变量fpfp,如果失败,则,如果失败,则fopenfopen函数返回空指函数返回空指针针NULLNULL。C C语言程序设计语言程序设计10.2 10.2 文件的打开与关闭文件的打开与关闭 10.2.1 10.2.1 文件打开(文件打开(fopenfopen函数)函数)n n文件的打开方式文件的打开方式文件操作方式文件操作方式 含义含义 “r”“r”读方式打开文本文件读方式打开文本文件 “w”“w”写方式打开文本文件写方式打开文本文件 “a”“a”向文本文件尾添加数据向文本文件尾添加数据 “rb”“rb”读方式打开二进制文件
9、读方式打开二进制文件 “wb”“wb”写方式打开二进制文件写方式打开二进制文件 “ab”“ab”向二进制文件尾添加数据向二进制文件尾添加数据 “r+”“r+”读读/写方式打开文本文件写方式打开文本文件 “w+”“w+”读读/写方式建立文本文件写方式建立文本文件 “a+”“a+”读读/写方式打开本文文件写方式打开本文文件 “rb+”“rb+”读读/写方式打开二进制文件写方式打开二进制文件 “wb+”“wb+”读读/写方式建立新二进制文件写方式建立新二进制文件 “ab+”“ab+”读读/写方式打开二进制文件写方式打开二进制文件 C C语言程序设计语言程序设计n n说明:语句中说明:语句中fpfp为
10、文件打开时获得的文件为文件打开时获得的文件类型指针。当对文件操作完成后,应当关类型指针。当对文件操作完成后,应当关闭文件。不关闭文件在程序编译阶段是检闭文件。不关闭文件在程序编译阶段是检测不出来的,因此,应牢记在使用文件完测不出来的,因此,应牢记在使用文件完毕时应关闭文件。毕时应关闭文件。10.2 10.2 文件的打开与关闭文件的打开与关闭 10.2.2 10.2.2 文件的关闭(文件的关闭(fclosefclose函数)函数)n nfclose()fclose()函数调用形式为:函数调用形式为:函数调用形式为:函数调用形式为:fclose(fclose(文件指针文件指针文件指针文件指针);)
11、;例如:例如:例如:例如:fclose(fp);fclose(fp);C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.1 10.3.1 字符读写函数字符读写函数 10.3.2 10.3.2 数据块读写函数数据块读写函数 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 10.3.4 fputs10.3.4 fputs函数和函数和fgetsfgets函数函数 C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 当文件被正常打开后,才能对它进行读或写当文件被正常打开后,才能对它进行读或写的操作。的操作。语言是以文
12、件操作函数实现对文件的读写语言是以文件操作函数实现对文件的读写操作的。操作的。针对针对ASCIIASCII文件或二进制文件,文件的读写操文件或二进制文件,文件的读写操作函数不同。作函数不同。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.1 10.3.1 字符读写函数字符读写函数 1fputc函数函数 n nfpuc函数的功能是写一个字符到磁盘文件。函数的功能是写一个字符到磁盘文件。其函数调用形式为:其函数调用形式为:fpuc(ch,fp);n n说明:说明:chch是要写入的字符,是要写入的字符,charchar类型,是类型,是字符常量或字符变量。字
13、符常量或字符变量。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.1 10.3.1 字符读写函数字符读写函数 2fgetc函数函数 n nfpuc函数的功能是从磁盘中读入一个字符。函数的功能是从磁盘中读入一个字符。其函数调用形式为:其函数调用形式为:ch=fgetc(fp);n n例如:例如:while(!feof(fp)c=fgetc(fp);feof()函数的作用是函数的作用是 判断文件是否结束,判断文件是否结束,当文件结束时返回,当文件结束时返回,否则返回。否则返回。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作
14、10.3.1 10.3.1 字符读写函数字符读写函数 例:从键盘输入字符,以例:从键盘输入字符,以“$”“$”作为结束,并作为结束,并将它们写入磁盘文将它们写入磁盘文件件。#include void main()FILE *fp;char ch,myfile 20;printf(“please input a filename:n”);scanf(“%s”,myfile);if(fp=fopen(myfile,“w”)=NULL)printf(“Cannot open this filen”);exit(0);C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10
15、.3.1 10.3.1 字符读写函数字符读写函数 printf(“please input some text:n”);while(ch=getchar()!=$)fputc(ch,fp);/*写入磁盘文件写入磁盘文件*/putchar(ch);fclose(fp);/*关闭文件关闭文件*/程序运行如下程序运行如下:please input a filename:please input some text:very good$very good n由程序运行结果来看,从键盘输入欲写入由程序运行结果来看,从键盘输入欲写入磁盘文件的字符与显示器显示的字符完全磁盘文件的字符与显示器显示的字符完全相
16、同,表示写字符到磁盘文件的操作成功相同,表示写字符到磁盘文件的操作成功。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2 10.3.2 数据块读写函数数据块读写函数 1fwrite函数函数 n nfwrite函数的功能是从指定内存空间写一函数的功能是从指定内存空间写一组数据到磁盘文件。其函数调用形式为:组数据到磁盘文件。其函数调用形式为:fwrite(buffer,size,count,fp);2fread函数函数 n nfread函数的功能是从磁盘文件读入一组数函数的功能是从磁盘文件读入一组数据到指定内存空间。其函数调用形式为:据到指定内存空间。其
17、函数调用形式为:fread(buffer,size,count,fp);C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2 10.3.2 数据块读写函数数据块读写函数 n n说明:说明:buffer buffer为任意类型的指针,它指向要写入为任意类型的指针,它指向要写入(读出)文件的数据块在内存中的起始地址。读出)文件的数据块在内存中的起始地址。size size为为intint类型,它表示写入类型,它表示写入(读出)文件读出)文件的数据块的大小(字节数)。应当注意参的数据块的大小(字节数)。应当注意参数数sizesize的使用,因为不同的数据类型,
18、在的使用,因为不同的数据类型,在内存中占用的空间是不同的。内存中占用的空间是不同的。count count为为intint类型,它表示写入类型,它表示写入(读出)文件读出)文件的数据块个数。的数据块个数。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2 10.3.2 数据块读写函数数据块读写函数 例:例:从键盘输入从键盘输入1010个教师的姓名、性别和年龄个教师的姓名、性别和年龄信息,并将这些信息建立一个磁盘文件。然后信息,并将这些信息建立一个磁盘文件。然后打开该文件,读出信息并显示该文件内容。打开该文件,读出信息并显示该文件内容。#include
19、void main()struct teacher char name20;char sex;int age;teachers;C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2 10.3.2 数据块读写函数数据块读写函数 FILE*fp;char fname20;int i;printf(“please input a file name:n”);scanf(“%s”,fname);if(fp=fopen(fname,“wb”)=NULL)printf(“cannot open this filen”);exit(0);printf(“please
20、input ten teachers name,sex and age:n”);C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2 10.3.2 数据块读写函数数据块读写函数 for(i=0;i9;i+),&,&);if(fwrite(&teachers,sizeof(teachers),1,fp)!=1)/*教师信息写入磁盘文件教师信息写入磁盘文件*/printf(“write errorn”);exit(0);fclose(fp);/*关闭文件关闭文件*/C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.2
21、10.3.2 数据块读写函数数据块读写函数 if(fp=fopen(fname,“rb”)=NULL)printf(“cannot open this filen”);exit(0);while!feof(fp)if(fread(&teachers,sizeof(teachers),1,fp)=1)printf(“%-16s%-8c%-8d%n”,);fclose(fp);C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 1fprintf函数函数 n nfprintf函数的功能是将各个不同类型的数函
22、数的功能是将各个不同类型的数据依次按照指定格式写入磁盘文件。其函据依次按照指定格式写入磁盘文件。其函数调用形式为:数调用形式为:fprintf(fp,格式字符串,输出列表,格式字符串,输出列表);2fscanf函数函数 n nfscanf()函数的功能是将磁盘文件中各个函数的功能是将磁盘文件中各个不同类型的数据按照指定格式依次读入对不同类型的数据按照指定格式依次读入对应的变量地址中。其函数调用形式为应的变量地址中。其函数调用形式为:fprintf(fp,格式字符串,输入列表,格式字符串,输入列表);这两个函数与前面章节学的这两个函数与前面章节学的printf和和scanf函数有什么不同?函数有
23、什么不同?C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 n nfprintf()fprintf()、fscanf()fscanf()函数中和函数中和printf()printf()、scanfscanf()()函数在调用形式上相比较,只是多了参函数在调用形式上相比较,只是多了参数数fpfp,指向将进行读写操作的文件类型指,指向将进行读写操作的文件类型指针。在使用时,如果将针。在使用时,如果将fprintf()fprintf()、fscanffscanf()()函数中参数函数中参数fpfp写为标准
24、输出和输入设备写为标准输出和输入设备的文件指针的文件指针stdoutstdout、stdinstdin,其功能与,其功能与printfprintf()()、scanf()scanf()相同。其他参数的意义相同。相同。其他参数的意义相同。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 例:例:从键盘输入一个字符串和一个整数,将其从键盘输入一个字符串和一个整数,将其写入写入myfilemyfile文件中,然后再打开文件,从文件文件中,然后再打开文件,从文件中读出数据并显示。中读出数据并显示。#incl
25、ude void main()char s20 int a FILE*fp;if(fp=fopen(“myfile”,“w”)=NULL)/*以写方式打开磁盘文件以写方式打开磁盘文件*/C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 printf(“cannot open this filen”);exit(0);fscanf(stdin,“%s%d”,s,&a);/*从标准输入设备(键盘)读入数据从标准输入设备(键盘)读入数据*/fprintf(fp,“%s%d”,s,&a);/*以格式化写方式
26、将从键盘读入的数据以格式化写方式将从键盘读入的数据 写入磁盘文件写入磁盘文件*/fclose(fp);/*关闭文件关闭文件*/C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.3 10.3.3 格式化文件读写函数格式化文件读写函数 if(fp=fopen(“myfile”,“r”)=NULL)/*以读方式打开磁盘文件以读方式打开磁盘文件*/printf(“cannot open this filen”);exit(0);fscanf(fp,“%s%d”,s,&a);/*以格式化读方式从磁盘文件读入数据以格式化读方式从磁盘文件读入数据*/fprintf(s
27、tdout,%s%dn,s,a);/*在标准输出设备(显示器)显示数据在标准输出设备(显示器)显示数据*/fclose(fp);/*关闭文件关闭文件*/C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.4 fputs10.3.4 fputs函数和函数和fgetsfgets函数函数 1fputs函数函数 n nfputs()函数的功能是将一个字符串写入磁函数的功能是将一个字符串写入磁盘文件。其函数调用形式为:盘文件。其函数调用形式为:fputs(str,fp);n n说明:说明:strstr可以为字符串常量、存放字符串可以为字符串常量、存放字符串的字符数组
28、名、指向字符串的字符指针或的字符数组名、指向字符串的字符指针或返回字符串的函数调用。返回字符串的函数调用。fpfp为指向将进行为指向将进行写操作的文件类型指针。操作成功函数返写操作的文件类型指针。操作成功函数返回值为,否则为非。回值为,否则为非。C C语言程序设计语言程序设计10.3 10.3 文件的读写操作文件的读写操作 10.3.4 fputs10.3.4 fputs函数和函数和fgetsfgets函数函数 2fgets函数函数 n nfgets()函数的功能是从磁盘文件中读入指函数的功能是从磁盘文件中读入指定长度的字符串。其函数调用形式为:定长度的字符串。其函数调用形式为:fgets(s
29、tr,n,fp);n n说明:说明:strstr可以为存放读入字符的数组名或可以为存放读入字符的数组名或存放读入字符的内存块的字符指针,参数存放读入字符的内存块的字符指针,参数n n为整数类型,指明要从文件中读取为整数类型,指明要从文件中读取n-1n-1个字个字符赋值给符赋值给strstr,存入,存入str str 的第的第n n个字符为个字符为00。fpfp为指向将进行写操作的文件类为指向将进行写操作的文件类型指针。函数的返回值为型指针。函数的返回值为strstr的首地址。的首地址。C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.1 rewind10.4.1
30、 rewind函数函数 10.4.2 fseek10.4.2 fseek函数函数 10.4.3 ftell10.4.3 ftell函数函数 C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 在语言缓冲文件系统中,对文件的操作都在语言缓冲文件系统中,对文件的操作都是顺序读写的,即每读写一个字节,则位置指是顺序读写的,即每读写一个字节,则位置指针自动移动指向下一字节。针自动移动指向下一字节。在实际对文件的应用中,往往需要对文件中在实际对文件的应用中,往往需要对文件中某个特定的数据进行处理,这样就要求改变读某个特定的数据进行处理,这样就要求改变读写顺序,强制移动位置指针,使其指
31、向指定的写顺序,强制移动位置指针,使其指向指定的位置。位置。C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.1 rewind10.4.1 rewind函数函数 rewind函数函数 n nrewind()rewind()函数的功能是使文件位置指针重函数的功能是使文件位置指针重新指向文件的开头。其函数调用形式为:新指向文件的开头。其函数调用形式为:rewind(fp);rewind(fp);n n说明:说明:fpfp为已经打开的文件类型指针。该为已经打开的文件类型指针。该函数没有返回值。函数没有返回值。C C语言程序设计语言程序设计10.4 10.4 文件的定位
32、文件的定位 10.4.1 rewind10.4.1 rewind函数函数 例:例:在显示器上显示文件的内容,然后将复制在显示器上显示文件的内容,然后将复制到。到。#include void main()FILE*fp1,*fp2;if(fp1=fopen(“file1.c”,“r”)=NULL)/*以读方式打开磁盘文件以读方式打开磁盘文件file1.c*/printf(“cannot open the file1.c n”);exit(0);C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.1 rewind10.4.1 rewind函数函数 if(fp2=fop
33、en(“file2.c”,“w”)=NULL)/*以写方式打开磁盘文件以写方式打开磁盘文件file2.c*/printf(“cannot open the file2.c n”);exit(0);while(!feof(fp1)/*在显示器上显示文件的内容在显示器上显示文件的内容*/putchar(fgetc(fp1);rewind(fp1);/*完成显示的内容后,其指针已完成显示的内容后,其指针已指向文件结尾,为完成复制文件,指向文件结尾,为完成复制文件,将的位置指针重新指向文件的开头将的位置指针重新指向文件的开头*/C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 1
34、0.4.1 rewind10.4.1 rewind函数函数 while(!feof(fp1)/*fp指向一个已经打开的文件指向一个已经打开的文件*/fputc(fgetc(fp1),fp2);/*将复制到将复制到file2.c*/fclose(fp1);/*关闭文件关闭文件file1.c*/fclose(fp2);/*关闭文件关闭文件file2.c*/C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.2 fseek10.4.2 fseek函数函数 fseek函数函数 n nfseek()fseek()函数的功能是使文件位置指针指向函数的功能是使文件位置指针指向文
35、件的指定位置。其函数调用形式为:文件的指定位置。其函数调用形式为:fseek(fpfseek(fp,位移量,起始点,位移量,起始点););n n说明:起始点是指从文件的什么位置为基说明:起始点是指从文件的什么位置为基准进行移动,其值可以是、或,准进行移动,其值可以是、或,表示表示“文件的开头文件的开头”,表示,表示“文件的当文件的当前位置前位置”,表示,表示“文件的末尾文件的末尾”。位移。位移量是指相对于起始点要移动的字节数,量是指相对于起始点要移动的字节数,语言定义位移量为语言定义位移量为longlong类型。类型。可以用可以用SEEK_SET,SEEK_CUR,SEEK_END分别表示分别
36、表示0、1、2 C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.2 fseek10.4.2 fseek函数函数 n n例例1 1:fseek(fp,100L,SEEK_SET);fseek(fp,100L,SEEK_SET);或者或者fseek(fp,100L,0);fseek(fp,100L,0);表示将文件指针移动到距离文件开头表示将文件指针移动到距离文件开头100100个个字节处。字节处。n n例例2 2:fseek(fp,80L,SEEK_CUR);fseek(fp,80L,SEEK_CUR);或者或者fseek(fp,80L,1);fseek(fp,
37、80L,1);表示将文件指针移动到距离文件当前位置表示将文件指针移动到距离文件当前位置5050个字节处。个字节处。C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.2 fseek10.4.2 fseek函数函数 n n例例3 3:fseek(fp,-60L,SEEK_END);fseek(fp,-60L,SEEK_END);或者或者fseek(fp,-60L,2);fseek(fp,-60L,2);表示将文件指针移动到距离文件末尾表示将文件指针移动到距离文件末尾1010个个字节处。字节处。n n说明:位移量的值可以是正值或者负值。说明:位移量的值可以是正值或者负
38、值。正值表示向文件的尾部方向移动,而负值正值表示向文件的尾部方向移动,而负值表示向文件的头部方向移动。表示向文件的头部方向移动。fseek()fseek()函数函数一般用于二进制文件。一般用于二进制文件。C C语言程序设计语言程序设计10.4 10.4 文件的定位文件的定位 10.4.3 ftell10.4.3 ftell函数函数 ftell函数函数 n nftellftell函函数数的的功功能能是是返返回回文文件件位位置置指指针针当当前前指指向向的的位位置置,用用相相对对于于文文件件开开头头的的偏偏移移量量的字节数表示。的字节数表示。n n函数调用成功返回值为函数调用成功返回值为longlo
39、ng类型的偏移量类型的偏移量值,如果出错则返回值,如果出错则返回-1L-1L。C C语言程序设计语言程序设计10.5 10.5 出错检测出错检测 10.5.1 ferror10.5.1 ferror函数函数 10.5.2 clearerr10.5.2 clearerr函数函数 C C语言程序设计语言程序设计10.5 10.5 出错检测出错检测 C语言中对文件的操作都是通过调用函数来实语言中对文件的操作都是通过调用函数来实现的,而在调用这些函数的过程中,用户需要现的,而在调用这些函数的过程中,用户需要掌握函数调用后是否成功。掌握函数调用后是否成功。除了通过函数本身返回值来判断是否调用成除了通过函
40、数本身返回值来判断是否调用成功外,功外,C C函数库提供了一些检查输入输出函数函数库提供了一些检查输入输出函数调用错误的函数。调用错误的函数。C C语言程序设计语言程序设计10.5 10.5 出错检测出错检测 10.5.1 ferror10.5.1 ferror函数函数 ferror函数函数 n nferror()函数的功能是测试函数的功能是测试fp所指的文件所指的文件是否有错误。其函数调用形式为:是否有错误。其函数调用形式为:ferror(fp);n n说明:如果在读写文件时发生错误,则说明:如果在读写文件时发生错误,则ferrorferror()()函数返回非值,若未发生错误,返回函数返回
41、非值,若未发生错误,返回。n n如要测试一个读写操作,应在每次读写函如要测试一个读写操作,应在每次读写函数调用后,立即用数调用后,立即用ferorr()ferorr()函数进行测试。函数进行测试。C C语言程序设计语言程序设计10.5 10.5 出错检测出错检测 10.5.2 clearerr10.5.2 clearerr函数函数 clearerr函数函数 n nclearerr()函数的功能是使文件错误标志和函数的功能是使文件错误标志和文件结束标志置。函数调用形式为:文件结束标志置。函数调用形式为:clearerr(fp);n n说明:说明:任何文件读写操作发生错误后,错任何文件读写操作发生
42、错误后,错误标志将一直保留,直至对该文件调用误标志将一直保留,直至对该文件调用clearerrclearerr()()函数或函数或rewind()rewind()函数,或对该文件进行函数,或对该文件进行另一次读写操作,该错误标志才被清除。另一次读写操作,该错误标志才被清除。C C语言程序设计语言程序设计例:假设文件例:假设文件stu_liststu_list中存放中存放2020个学生记录个学生记录(学号范围为(学号范围为0 0至至1919),从文件中读出指定学),从文件中读出指定学号的学生记录,显示在屏幕上,提示用户是否号的学生记录,显示在屏幕上,提示用户是否需要修改,若用户提示修改则由用户输
43、入新内需要修改,若用户提示修改则由用户输入新内容写到原文件中。容写到原文件中。解解:设设学学生生记记录录数数据据采采用用结结构构体体数数据据类类型型,文文件件以以“rb+”的的方方式式打打开开,fseek()函函数数操操作作位位置置指指针针移移动动应应以以一一个个结结构构体体长长度度为为单单位位进进行行移移动动,以以fread函函数数从从文文件件读读入入一一个个记记录录数数据据到到指指定定内内存存空空间间,并并逐逐个个显显示示记记录录数数据据。如如需需修修改改,则则以以fseek()函函数数定定位位,fwrite函函数数完完成修改。成修改。10.6 10.6 综合示例综合示例 C C语言程序设
44、计语言程序设计#include struct student_type char name10;int num;int age;float mark;stu;void main()int i;char ch;FILE*p;10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计 if(fp=fopen(“stu_list”,“rb+”)=null)printf(“cannot open this filen”);exit(0);printf(“please input student_idn”);scanf(“%d”,&i);while(i=0)fseek(fp,i*sizeof(
45、struct student_type),0);/*移动指针移动指针*/fread(&stu,sizeof(structstudent_type),1,fp);10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计 printf(“%10s%6d%6d%6d”,stu.name,);printf(“Update or not?(Y/N)”);flushall();/*清空输入输出缓冲区清空输入输出缓冲区*/scanf(“%c”,&ch);if(ch=Y|ch=y)printf(“please input new data:n”);,&);10.6 10.6 综合示例综合示例 C
46、C语言程序设计语言程序设计 fseek(fp,i*sizeof(struct student_type),0);fwrite(&stu,sizeof(struct student_type),1,fp);printf(“please input next student_id:”);scanf(“%d”,&i);fclose(fp);10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计 例:建立一个乘法口诀的文本格式文件,其例:建立一个乘法口诀的文本格式文件,其格式为:格式为:1*1=1 1*1=1 1*2=2 2*2=4 1*2=2 2*2=4 1*3=3 2*3=6 3*3
47、=9 1*3=3 2*3=6 3*3=9 1*9=9 1*9=9 9*9=819*9=81 文件建立后,再将其读出显示在屏幕上,进文件建立后,再将其读出显示在屏幕上,进行验证。行验证。10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计解解:先先以以fopen()fopen()函函数数“w+”“w+”方方式式创创建建新新文文件件。写写入入乘乘法法口口诀诀时时采采用用格格式式化化写写入入文文件件函函数数fprintffprintf()(),将将数数据据依依次次按按照照指指定定格格式式写写入入新新建建文文件件。读读出出文文件件时时,需需要要用用rewind()rewind()移移动
48、动指指针针至至文文件件首,然后逐个字符读出并显示。首,然后逐个字符读出并显示。#include void main()int m,n;FILE *rep;/*文件指针文件指针*/10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计 if(rep=fopen(“muti.rep”,“w+”)=NULL)/*打开目的磁盘文件打开目的磁盘文件*/printf(“cannot open out file!n”);return(0);for(m=1;m=9;m+)for(n=1;n=m;n+)10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计 fprintf(rep,“
49、%d*%d=%d”,n,m,n*m);/*格式化写入格式化写入*/fprintf(rep,“n”);/*换行换行*/rewind(rep);/*为了读文件移动文件指针至文件起始为了读文件移动文件指针至文件起始*/for(;!feof(rep);putchar(fgetc(rep);/*读文件并显示读文件并显示*/fclose(rep);/*关闭文件关闭文件*/程序运行将显示程序运行将显示乘法口诀表乘法口诀表 10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计例:从键盘输入一行字符串,将其中的小写字例:从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘
50、母全部转换成大写字母,然后输出到一个磁盘文件文件“myfile”“myfile”中保存。中保存。解:先以解:先以fopen()fopen()函数函数“w”“w”方式创建方式创建“myfile”“myfile”文件。从键盘读入一个字符串,逐文件。从键盘读入一个字符串,逐个字符处理,再用个字符处理,再用fputc()fputc()写入文件。最后还写入文件。最后还可以打开该文件,读出该文件内容进行验证。可以打开该文件,读出该文件内容进行验证。10.6 10.6 综合示例综合示例 C C语言程序设计语言程序设计#include void main()FILE*P;char str100;int i;i