9.4.1 文件检查函数
在文件读写的过程中,很有可能会发生异常或错误,使得读写函数执行失败。例如文件游标处于文件尾,所读写的文件被损坏,在读写 U 盘文件时 U 盘被强行拔出。因此,在读写函数执行失败时,可以调用相应的文件检查函数来获取相关信息。
feof 函数用于检查当前文件游标是否处于文件尾。该函数原型如下:
int feof( FILE *stream );
feof 函数的参数 stream 为与文件相关联的文件流,函数的返回值为 int 类型的整型值,若文件游标处于文件尾位置,函数返回非零值,否则,函数返回 0。
下面用一段程序代码演示 feof 函数的使用,例如:
在程序代码中,使用了一个无限的 while 循环,在循环体中,首先通过 feof 函数来检查当前文件游标是否处于文件尾,若是的话,就打印输出读取到文件尾的信息,并通过 break 语句终止 while 循环。若文件游标不是处于文件尾,则通过格式化方式读取字符串到字符数组 buf 中,并打印输出到控制台窗口。
编译运行程序,结果如下:
Test string! Read to the end of the file.
另外一个文件检查函数为 ferror,它的函数原型如下:
int ferror(FILE *stream);
ferror 函数的参数 stream 为与文件相关联的文件流,函数的返回值为 int 类型的整型值,若文件读写发生错误,函数返回非零值,否则,函数返回 0。
为了演示 ferror 函数的使用,我们可以在计算机上插入一个 U 盘,并在 U 盘中创建一个文本文件 test.txt,并在文件中输入一段字符“This is the data of the U disk file.”。假若 U 盘在计算机中的盘符为 H,下面在程序中读取这个文件中的数据。例如:
在程序中,用到了 Windows 的 API 函数 Sleep,它可以让程序运行的线程暂停执行,进入休眠状态,参数为休眠的时间,以毫秒(ms)为单位。为了使用 Sleep 函数,需要在程序中包含“windows.h”头文件。
在 for 循环中使用了 Sleep 函数,循环体共会执行 3 次,每次会打印一条信息并休眠 1000ms(1s)。
3 次休眠过后,会通过 fgets 函数从 U 盘的 test.txt 文件中读取数据并保存至 buf 数组中,如果读取过程发生错误,则在控制台窗口打印一条读取文件出错的信息,若读取过程没有发生错误,则打印一条没有错误发生的信息,并将 buf 数组中的字符串打印输出。
编译运行该程序,正常情况下,读取过程没有发生错误,结果如下:
…1… …2… …3… No errors occur. This is the data of the U disk file.
若重新运行该程序,并在前面 3 次休眠的过程中,把 U 盘从计算机上强行拔出,则会出现如下结果:
…1… …2… …3… An error occurred while reading the file.
C 标准库中,还有一个用于输出错误信息的 perror 函数,函数的原型如下:
void perror(const char *str);
perror 函数没有返回值,参数为指向一个字符串的指针。函数的功能为在控制台窗口打印输出参数 str 所指向的字符串,并且还会在后面将系统自定义的错误信息打印输出。若使用空字符串或者 NULL 作为函数参数,则 perror 函数只会输出系统自定义的错误信息。
可以将之前代码中发生错误时,由 printf 打印输出错误信息修改为由 perror 函数来完成。例如:
if(ferror(pfile)) perror("An error occurred while reading the file");
重新编译运行程序,并在休眠期间从计算机拔下 U 盘,则程序的运行结果如下:
…1… …2… …3… An error occurred while reading the file: Permission denied
可见,perror 函数除了会将参数所指向的字符串打印输出之外,还会将系统自定义的错误信息“Permission denied”接在参数字符串之后一并打印输出。
最后,要说明的是,perror 函数不光用于文件相关的库函数,当 C 语言标准库中的函数在执行失败的时候,用 perror 函数都可以打印输出系统给出的错误信息。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论