1. 程式人生 > >標準流和錯誤處理

標準流和錯誤處理

補充 close fputc lur font -s 是否 perror 一個

技術分享圖片

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 ,唉!!!!
請按任意鍵繼續. . .
*/ 

  


  

  

標準流和錯誤處理