• 标准流和错误处理


    test1.c:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    	FILE *fp;
    	if((fp = fopen("不存在的文件.txt","r")) == NULL)
    	{
    		printf("标准输出
    "); 
    		fputs("打开文件失败!
    ", 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("标准输出
    "); 
    		fputs("打开文件失败!
    ", stderr);
    		exit(EXIT_FAILURE);//退出 
    	}
    	while(1)
    	{
    		ch = fgetc(fp);
    		if(feof(fp))//feof:文件尾指示器
    		{
    			break; 
    		} 
    		putchar(ch);// 将读取到的字符打印出来 
    	} 
    	
    	fputc("abc", fp);//因为通过只读打开的,不能写入 
    	if(ferror(fp))
    	{
    		fputs("出错了!
    ", 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("标准输出
    "); 
    		fputs("打开文件失败!
    ", stderr);
    		exit(EXIT_FAILURE);//退出 
    	}
    	while(1)
    	{
    		ch = fgetc(fp);
    		if(feof(fp))//feof:文件尾指示器
    		{
    			break; 
    		} 
    		putchar(ch);// 将读取到的字符打印出来 
    	} 
    	
    	fputc("abc", fp);//因为通过只读打开的,不能写入 
    	if(ferror(fp))
    	{
    		fputs("出错了!
    ", stderr);
    	} 
    	
    	clearerr(fp);
    	if(feof(fp) || ferror(fp))
    	{
    		printf("不会被打印出
    ");
    	} 
    	
    	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
    ", 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 ,唉!!!!
    ",strerror(errno));
    		exit(EXIT_FAILURE);//退出 
    	}
    	
    	fclose(fp);
    	
    	return 0; 
    }
    /*运行结果: 
    出错!原因是: No such file or directory ,唉!!!!
    请按任意键继续. . .
    */ 
    

      

    
    

      

      

  • 相关阅读:
    jQuery基础开发详解 重要
    Jquery插件form和cookie
    javascript keycode大全
    用户体验一些链接
    SQL导入Excel数据时,数字中混有字符将导致数据丢失的解决办法
    列出本机所有固定驱动器和可移动驱动器
    ADOQUERY,CLIENTDATASET,ADOSTOREPROC执行存储过程【多种方法】
    如何发布 JSON 项目?[转橙子]
    ADOQUERY,CLIENTDATASET,ADOSTOREPROC执行存储过程【多种方法】
    ADOQUERY,CLIENTDATASET,ADOSTOREPROC执行存储过程【多种方法】
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/10500693.html
Copyright © 2020-2023  润新知