目录
- 1.perror()
- 2.ferror()
- [3. 手动清除错误码clearerr()](#3. 手动清除错误码clearerr())
- 4.feof函数
1.perror()
功能:提示当前错误类型;
#include <stdio.h>
void main(int argc, const char *argv[])
{
//以只读方式打开文件
int pt_err = 0;
FILE * fp = fopen("/home/cat/115.c", "a");
if(fp == NULL)
{
perror("fopen文件打开失败!");
return -1;
}
else
{
printf("文件打开成功!\n");
}
if(EOF == (fputs("Hello World!\n", fp)))
{
perror("fputs写入失败!");
return -1;
}
else
{
printf("写入成功!\n");
}
pt_err = fclose(fp);
if(pt_err == EOF)
{
perror("fclose");
return -1;
}
else
{
printf("文件关闭成功!");
}
return 0;
}
2.ferror()
功能: 检查文件是否因错误而终止;
1.ferror() 用于检测文件流的错误标志,参数为 FILE* 指针,返回非 0 表示上一次 I/O 操作出错,0 表示无错误。
2.ferror() 需与 feof() 配合使用:当读写操作返回 EOF 时,用两者区分 "正常到末尾" 和 "操作出错"。
3.错误标志具有 "粘性",需用 clearerr() 手动清除;配合 perror() 可打印具体错误原因,是定位问题的关键。
#include <stdio.h>
#include <string.h>
int main(int argc, const char* argv[])
{
FILE *fp;
size_t fp_read;
fp = fopen(argv[1], "rb");
if(fp == NULL)
{
perror("文件打开失败!");
return -1;
}
printf("文件打开成功!\n");
/*
检查是否到达文件结尾
*/
if(feof(fp)) //非0读取到结尾
{
printf("读取到文件结尾!\n");
}
else if(ferror(fp)) //0未读取到结尾
{
printf("读取文件发生错误!\n");
perror("错误详情:");
clearerr(fp); //不手动清除错误码状态不会改变
}
fclose(fp);
return 0;
}
3. 手动清除错误码clearerr()
不手动清除错误码状态不会改变
4.feof函数
功能:
1.feof() 核心是检测文件流的 EOF 标志位,参数为 FILE* 类型文件指针,返回非 0 表示标志已置位、0 表示未置位。
2.正确用法是 "先读数据,再用读操作返回值终止循环,最后用 feof () 区分终止原因",切勿将 feof () 作为循环条件。
3.配合 ferror() 可定位读操作失败的真实原因,配合 clearerr() 可重置文件流的 EOF / 错误标志。
#include <stdio.h>
#include <string.h>
int main(int argc, const char* argv[])
{
FILE *fp;
size_t fp_read;
fp = fopen(argv[1], "rb");
if(fp == NULL)
{
perror("文件打开失败!");
return -1;
}
printf("文件打开成功!\n");
char buf[1024] = {0};
int cnt = 0;
while((fp_read = fread(buf, 1, 1024, fp)) > 0)
{
cnt++;
if(cnt > 1021)
{
cnt = 0;
}
}
printf("%s\n", buf);
/*
检查是否到达文件结尾
*/
if(feof(fp)) //非0读取到结尾
{
printf("读取到文件结尾!\n");
}
else //0未读取到结尾
{
printf("未读取到文件结尾!!!\n");
}
fclose(fp);
return 0;
}