错误处理
文件操作可能因多种原因失败:文件不存在、权限不足、磁盘已满、设备错误等。正确处理这些错误是健壮程序的必要条件。C 标准库提供 ferror、feof、clearerr、perror 等函数帮助诊断和处理文件错误。
检测文件结束和错误
FILE *fp = fopen("data.txt", "r");
if (fp != NULL) {
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
if (feof(fp)) {
printf("\nEnd of file reached\n");
} else if (ferror(fp)) {
printf("\nRead error occurred\n");
}
fclose(fp);
}
perror
FILE *fp = fopen("nonexistent.txt", "r");
if (fp == NULL) {
perror("fopen"); /* 输出:fopen: No such file or directory */
}
perror 输出用户提供的字符串,后跟冒号和系统错误信息。
errno
#include <errno.h>
FILE *fp = fopen("/root/secret.txt", "w");
if (fp == NULL) {
if (errno == EACCES) {
printf("Permission denied\n");
} else if (errno == ENOENT) {
printf("File not found\n");
}
}
清除错误标志
FILE *fp = fopen("data.txt", "r");
/* 发生错误 */
clearerr(fp); /* 清除 EOF 和错误标志 */
/* 可以继续操作 */
常见错误
不区分 EOF 和错误:
while (fgetc(fp) != EOF) /* 循环结束可能是 EOF 或错误 */
;
/* 正确 */
int ch;
while ((ch = fgetc(fp)) != EOF) {
/* 处理 */
}
if (ferror(fp)) {
/* 处理错误 */
}
忽略写入错误:
fprintf(fp, "Important data\n");
fclose(fp); /* 如果缓冲区刷新失败,数据丢失! */
/* 正确 */
if (fclose(fp) != 0) {
perror("fclose"); /* 可能发现写入错误 */
}
最佳实践
- 每次文件操作后检查返回值
- 用
feof和ferror区分 EOF 和错误 - 用
perror输出友好的错误信息 - 写入后检查
fclose返回值 - 设计错误恢复策略(重试、跳过、退出)