小甲鱼 P60 标准流和错误处理
标准流
文件流:
标准输入流(stdin)
标准输出流(stdout)
标准错误输出流(stderr)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
if ((fp = fopen("yagenerdoubucunzaidewenjian.txt", "r")) == NULL)
{
//把它输出stderr,stderr是文件指针
fputs("打开文件失败!\n", stderr);
exit(EXIT_FAILURE);
}
//do something...
fclose(fp);
return 0;
}
错误处理
错误指示器-ferror
扫描二维码关注公众号,回复:
3581300 查看本文章
clearerr()函数可以人为地清除文件末尾指示器和错误指示器的状态
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if ((fp = fopen("output.txt", "r")) == NULL)
{
//把它输出stderr,stderr是文件指针
fputs("打开文件失败!\n", stderr);
exit(EXIT_FAILURE);
}
while (1)
{
//在fp指向的文件读取一个字符
ch = fgetc(fp);
// feof检测此时位于文件的末尾
if (feof(fp))
{
break;
}
//打印
putchar(ch);
}
//是以只读来打开文件,fputc写入一个字符,错误
fputc('c', fp);
if (ferror(fp))
{
fputs("出错了!\n", stderr);
}
clearerr(fp);
if (feof(fp) || ferror(fp))
{
printf("啦啦\n");
}
fclose(fp);
return 0;
}
ferror()函数只能检测是否出错,但无法获取错误原因。不过,大多数系统函数在出现错误的时候会将错误原因记录在errno中。
perror()函数可以直观地打印出错误原因。
strerror()函数直接返回错误码对应的错误信息
#include <stdio.h>
#include <stdlib.h>
//#include <errno.h>
int main(void)
{
FILE *fp;
if ((fp = fopen("yagenerjiubucunzai.txt", "r")) == NULL)
{
//errno错误码,通过查看errno的文档,表示什么原因
//printf("打开文件失败,原因是:%d\n",errno);
perror("打开文件失败,原因是");
exit(EXIT_FAILURE);
}
fclose(fp);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
FILE *fp;
if ((fp = fopen("yagenerjiubucunzai.txt", "r")) == NULL)
{
//fprintf将格式的字符串打印到文件中
fprintf(stderr, "出错啦,原因竟然是 -> %s <- 这个!\n", strerror(errno));
exit(EXIT_FAILURE);
}
fclose(fp);
return 0;
}