C/C++函数与算法速查宝典
上QQ阅读APP看书,第一时间看更新

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)在读/写文件之前,需要先判断是否成功打开了文件,否则,将产生异常。在文件操作过程中,最好检查每一步操作,养成一个良好的编程习惯。