标准流和错误处理

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 ,唉!!!!
请按任意键继续. . .
*/ 

  


  

 

 

  

posted @ 2019-03-09 14:33  耐烦不急  阅读(362)  评论(0编辑  收藏  举报