小甲鱼 P60 标准流和错误处理

小甲鱼 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

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;
}

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/82987169