标准流和错误处理

文章目录


标准流

当一个程序被执行的时候,C语言会自动打开三个面向终端的文件流
在这里插入图片描述
printf打印的时候就是向标准输出写入
scanf就是向标准输入写入
报错的输出就是标准错误输出
当文件打开错误时候,将信息输出到标准错误输出流

FILE *fp;
if((fp=fopen("notexit.txt","r"))==NULL)
{
fputs("fail to open\n",stderr);//stderr是一个文件指针,程序一执行就有的,不需要我们定义
}
fclose(fp);

fail to open 效果跟printf看起来一模一样
为了区分它们可用linux shell的重定向功能:
在这里插入图片描述
把代码修改

FILE *fp;
if((fp=fopen("notexit.txt","r"))==NULL)
{
printf("标准输出")
fputs("fail to open\n",stderr);//stderr是一个文件指针,程序一执行就有的,不需要我们定义
}
fclose(fp);

在这里插入图片描述
标准输出就到了txt文件中,不再出现在屏幕上

错误处理

错误指示器-ferror用来接收错误

FILE *fp;
if((fp=fopen("notexit.txt","r"))==NULL)
{
printf("标准输出")
fputs("fail to open\n",stderr);//stderr是一个文件指针,程序一执行就有的,不需要我们定义
exit(EXIT_FAILURE);
}
while(1)
{
ch=fgetc(fp);
if(feof(fp))
{
break;
}
putchar(ch);
}
fputc('c',fp);//这里一定会出错,因为fp只读
if (ferror(fp))//ferror函数会检测到这个错误,就会运行if中的内容
{
fputs("something wrong!",stderr);//输出到错误输出流中去
}
fclose(fp);

使用clearerr函数可以人为地清除文件末尾指示器和错误指示器的状态,同时清除两个指示器的状态。

fputc('c',fp);//这里一定会出错,因为fp只读
if (ferror(fp))//ferror函数会检测到这个错误,就会运行if中的内容
{
fputs("something wrong!",stderr);//输出到错误输出流中去
}
clearerr(fp);
if(feof(fp)||ferror(fp))
{
printf("....")//并不会被打印,因为指示器已经都被清楚了
}
fclose(fp);

ferror函数只是检测是否出错,但无法获取错误原因,不过,大多数系统函数在出现错误的时候都会将错误记录在errno中
在这里插入图片描述
在这里插入图片描述
错误码是记录在errno里面
perror函数可以直观打印出错误原因,此时不需要头文件 errno.h
将printf()errno那句代码修改为
perror("打开文件失败,原因是");
运行的结果是
在这里插入图片描述
如果希望吧错误原因显示在字符串参数中间,perror函数就是显得有些死板
这时候可以用strerror函数,可以直接返回错误码对应的错误信息。这个函数需要用到errno.h的头文件
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值