//文件错误处理
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
//perror(s)函数: 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串
//feof()函数:检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0,文件结束符只能被clearerr()清除。
//ferror()函数:获取文件流状态,如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。
//clearerr()函数:使文件错误标志和文件结束标志置为0。
void main(){
//错误一:以写方式打开只读文件
//定义文件路径
char path[40] = "E:\\Look\\a.txt";
//定义文件指针
FILE *pf = fopen(path, "w");
if (pf==NULL)
{
printf("文件打开失败!\n");
perror("文件错误信息是");//perror()函数会输出参数s+“:”+具体文件错误信息
//错误一;打印权限不够
}
else{
fputs("今年在有没有齐天大圣了!!!",pf);
//错误二:在w模式下,执行文件读操作
//进行错误操作,开始读文件
//将指针移动到文件开头
rewind(pf);
char ch = fgetc(pf);
//fgetc()函数读取失败返回-1,读取到文件末尾返回-1;在fgetc()函数里的-1和EOF(end of file)等价
if (ch==EOF)
{
//判断文件是否到了末尾
if (feof(pf))//feof返回值为非0,表示到了文件末尾
{
printf("文件读取到了末尾\n");
//重置文件流状态,清除错误信号
clearerr(pf);
//注:如果不重置文件流状态,那么下次读取该文件正确状态仍然会报这个错误
}
//判断文件是否报错
if (ferror(pf))//ferror返回值为非0,意味着文件出错
{
printf("文件读取出错!\n");
perror("文件错误2信息是");
//重置文件流状态,清除错误信号
clearerr(pf);
}
}
else{
printf("%c\n",ch);
}
//关闭文件指针
fclose(pf);
//注:为何将fclose()写在else里面,而不是外面?
//因为如果文件打开失败,pf==NULL,空指针无法关闭,程序会报错
}
system("pause");
}
![]()