2.6 文件错误控制函数
在打开文件或对文件进行读取操作时,常常需要检查是否出现打开的文件不存在、磁盘I/O错误等错误,这时就需要使用文件错误控制函数进行判断。
2.6.1 clearerr函数──清除文件中的错误标志
1.函数原型
int clearerr(FILE *stream);
2.函数功能
clearerr函数的功能是将stream指向的文件的错误标志重新设置为0(即关掉错误标志),文件结束指示器也将被重置。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
如果读取或写入文件出现错误,则函数返回0;否则,返回非0值。
5.函数范例
/********************************************
*范例编号:02_30
*范例说明:清除文件中的错误标志
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main()
04 {
05 FILE *fp;
06 char ch;
07 int i;
08 fp=fopen(“mytest.txt”, “w+”);
09 for(i=0;i<26;i++)
10 fputc(‘a’+i,fp);
11 rewind(fp);
12 while((ch=fgetc(fp))!=EOF)
13 printf(“%c”,ch);
14 printf(“\n”);
15 if (ferror(fp))
16 {
17 printf(“文件读取错误!\n”);
18 clearerr(fp);
19 }
20 fclose(fp);
21 system(“pause”);
22 }
该函数范例的运行结果如图2-28所示。
图2-28 函数范例的运行结果
6.函数解析
(1)在以写的方式打开文件时,不能对文件进行读操作,否则将产生错误。在错误发生后,需要调用clearerr函数清除错误标志,使文件操作可以继续执行。如果文件操作没有发生错误,则会设置与流关联的错误指示符,返回非0值;否则,返回0。
(2)若将第8行代码
fp=fopen(“mytest.txt”, “w+”);
修改为
fp=fopen(“mytest.txt”, “w”);
则会在文件读取时出现错误。程序运行结果如图2-29所示。
图2-29 程序运行结果
2.6.2 feof函数──是否到了文件末尾
1.函数原型
int feof(FILE *stream);
2.函数功能
feof函数的功能是检查文件位置指针是否到了文件末尾。如果指针到了文件末尾,则返回非0值;否则,返回0。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
如果文件位置指针到了文件末尾,则函数返回非0值;否则,返回0。
5.函数范例
/********************************************
*范例编号:02_31
*范例说明:使用feof函数判断是否到了文件末尾
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main ()
04 {
05 FILE * fp;
06 int n=0,i;
07 char ch,str[80];
08 printf(“请输入一行字符:\n”);
09 gets(str);
10 fp=fopen (“mytest.txt”,”w+”);
11 if (fp==NULL)
12 printf(“打开文件错误!”);
13 else
14 {
15 for(i=0;i<strlen(str);i++)
16 fputc(str[i],fp);
17 }
18 rewind(fp);
19 while (!feof(fp))
20 {
21 ch=fgetc (fp);
22 putchar(ch);
23 n++;
24 }
25 fclose (fp);
26 printf (“\n读取的字符数:%d.\n”, n-1);
27 system(“pause”);
28 }
该函数范例的运行结果如图2-30所示。
图2-30 函数范例的运行结果
6.函数解析
在读取二进制文件时,文件中的数据有可能是−1,而EOF的值也可能是−1。如果用EOF作为文件结束的判断条件,这样就可能造成文件中的数据没有读取结束,因而被中断读入。为了避免这种错误的发生,可以采用feof函数判断是否真正到了文件末尾。
2.6.3 ferror函数──检查文件操作是否出现了错误
1.函数原型
int ferror(FILE *stream);
2.函数功能
ferror函数的功能是检查stream指向的文件在操作过程中是否出现了错误。
3.函数参数
参数stream:文件指针,指向文件对象。
4.函数的返回值
在操作过程中,如果没有出现错误,则函数返回0;否则,返回非0值。
5.函数范例
/********************************************
*范例编号:02_32
*范例说明:检查文件操作过程中是否出现了错误
*********************************************/
01 #include <stdio.h>
02 #include <stdlib.h>
03 void main ()
04 {
05 FILE *fp;
06 char str[81],ch;
07 fp=fopen(“mytest.txt”,”r”);
08 if(!fp)
09 {
10 printf(“文件打开错误.\n”);
11 exit(-1);
12 }
13 while(!feof(fp))
14 {
15 fread(str,1,27,fp);
16 if(ferror(fp))
17 {
18 printf(“文件读取错误!\n”);
19 exit(-1);
20 }
21 puts(str);
22 }
23 printf (“无错误.\n”);
24 fclose (fp);
25 system(“pause”);
26 }
该函数范例的运行结果如图2-31所示。
图2-31 函数范例的运行结果
6.函数解析
(1)若将第15行代码
fread(str,1,27,fp);
修改为
fputc(‘a’,fp);
则将产生文件读写错误。这是因为文件是以”r”的方式打开的。
为了使读取的字符不出现乱码,可使用fgetc函数逐个字符读取文件,再将其显示出来。将第15行代码修改为
ch=fgetc(fp);
将第21行代码修改为
putchar(ch);
则运行结果如图2-32所示。
图2-32 运行结果
(2)在读/写文件之前,需要先判断是否成功打开了文件,否则,将产生异常。在文件操作过程中,最好检查每一步操作,养成一个良好的编程习惯。