标准流和错误处理

test1.c:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在的文件.txt","r")) == NULL)
{
printf("标准输出\n");
fputs("打开文件失败!\n", stderr);
exit(EXIT_FAILURE);//退出
}
//do something...
return 0;
}
/*运行结果:
标准输出
打开文件失败!
请按任意键继续. . .
*/
重定向:
这里给大家补充一个课外知识点,由于标准输出和标准错误输出通帝都是直接打印到辱幕上,为了区分它们,我们可以使用Linux shel1的重定向功能:
- 重定向标准输入使用 <
- 重定向标准输出使用 >
- 重定向标准错误输出使用 2>
上述程序结果:

错误处理
错误指示器—ferror。
test2.c:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if((fp = fopen("output.txt","r")) == NULL)
{
printf("标准输出\n");
fputs("打开文件失败!\n", stderr);
exit(EXIT_FAILURE);//退出
}
while(1)
{
ch = fgetc(fp);
if(feof(fp))//feof:文件尾指示器
{
break;
}
putchar(ch);// 将读取到的字符打印出来
}
fputc("abc", fp);//因为通过只读打开的,不能写入
if(ferror(fp))
{
fputs("出错了!\n", stderr);
}
fclose(fp);
return 0;
}
结果:
使用clearerr函数可以人为地清除文件末尾指示器和错误指示器的状态。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if((fp = fopen("output.txt","r")) == NULL)
{
printf("标准输出\n");
fputs("打开文件失败!\n", stderr);
exit(EXIT_FAILURE);//退出
}
while(1)
{
ch = fgetc(fp);
if(feof(fp))//feof:文件尾指示器
{
break;
}
putchar(ch);// 将读取到的字符打印出来
}
fputc("abc", fp);//因为通过只读打开的,不能写入
if(ferror(fp))
{
fputs("出错了!\n", stderr);
}
clearerr(fp);
if(feof(fp) || ferror(fp))
{
printf("不会被打印出\n");
}
fclose(fp);
return 0;
}
结果:
ferror虽数只能检测是否出错,但无法获取错误原因。不过,大多数条统函数在出现错误的时候会将错误原因记录在errno中。需要errno.h头文件。
test3.c:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在的文件.txt","r")) == NULL)
{
printf("打开文件失败!原因是:%d\n", errno);
exit(EXIT_FAILURE);//退出
}
fclose(fp);
return 0;
}
/*运行结果:
打开文件失败!原因是:
请按任意键继续. . .
*/
perror函数可以直观地打印出错误原因。不需要 errno.h 头文件。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在的文件.txt","r")) == NULL)
{
perror("打开文件失败!原因是:");//不能将错误原因放在字符串中间,可以用下文中的strerror函数
exit(EXIT_FAILURE);//退出
}
fclose(fp);
return 0;
}
/*运行结果:
打开文件失败!原因是:: No such file or directory
请按任意键继续. . .
*/
strerror函数直接返回错误码对应的错误信息。需要 errno.h 头文件。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在的文件.txt","r")) == NULL)
{
fprintf(stderr,"出错!原因是: %s ,唉!!!!\n",strerror(errno));
exit(EXIT_FAILURE);//退出
}
fclose(fp);
return 0;
}
/*运行结果:
出错!原因是: No such file or directory ,唉!!!!
请按任意键继续. . .
*/

浙公网安备 33010602011771号