返回介绍

9.4.1 文件检查函数

发布于 2025-04-11 22:33:05 字数 2553 浏览 0 评论 0 收藏 0

在文件读写的过程中,很有可能会发生异常或错误,使得读写函数执行失败。例如文件游标处于文件尾,所读写的文件被损坏,在读写 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。