| feof(fp)有兩個返回值:如果遇到文件結(jié)束,函數(shù)feof(fp)的值為非零值,否則為0。  EOF是文本文件結(jié)束的標(biāo)志。在文本文件中,數(shù)據(jù)是以字符的ASCⅡ代碼值的形式存放,普通字符的ASCⅡ代碼的范圍是32到127(十進(jìn)制),EOF的16進(jìn)制代碼為0x1A(十進(jìn)制為26),因此可以用EOF作為文件結(jié)束標(biāo)志。  當(dāng)把數(shù)據(jù)以二進(jìn)制形式存放到文件中時,就會有-1值的出現(xiàn),因此不能采用EOF作為二進(jìn)制文件的結(jié)束標(biāo)志。為解決這一個問題,ASCI C提供一個feof函數(shù),用來判斷文件是否結(jié)束。feof函數(shù)既可用以判斷二進(jìn)制文件又可用以判斷文本文件。  “C”語言的“feof()”函數(shù)和數(shù)據(jù)庫中“eof()”函數(shù)的運(yùn)做是完全不同的。數(shù)據(jù)庫中“eof()”函數(shù)讀取當(dāng)前指針的位置,“C”語言的“feof()”函數(shù)返回的是最后一次“讀操作的內(nèi)容”。多年來把“位置和內(nèi)容”相混,從而造成了對這一概念的似是而非。  那么,位置和內(nèi)容到底有何不同呢?舉個簡單的例子,比如有人說“你走到火車的最后一節(jié)車箱”這就是位置。而如果說“請你一直向后走,摸到鐵軌結(jié)束”這就是內(nèi)容。也就是說用內(nèi)容來判斷會“多走一節(jié)”。這就是完全依賴于“while(!feof(FP)){...}”進(jìn)行文件復(fù)制時,目標(biāo)文檔總會比源文檔“多出一些”的原因。  在“C”文件讀取操作時不能完全依賴于“while(!feof(FP)){...}”的判斷。下面代碼是改進(jìn)后的代碼,該代碼執(zhí)行后output文件內(nèi)容和input文件內(nèi)容一致,與使用“while(!feof(FP)){...}”相比,input文件的結(jié)尾符號(EOF)沒有被讀入到output文件中。 int main(void) { 	FILE *in, *out; 	int ch; 	if((in = fopen("input.txt","rb")) == NULL){ 		return 0; 	} 	if((out = fopen("output.txt","wb")) == NULL){ 		return 0; 	} 	ch = fgetc(in); 	while(!feof(in))         //可以換成while(1) 	{ 		if(ch == -1) 			return 0; 		fputc(ch,out); 		ch = fgetc(in); 	} 	fclose(in); 	fclose(out); 	return 0; }與EOF的區(qū)別  在stdio.h中可以看到如下定義:  #define EOF (-1)  #define _IOEOF 0x0010  #define feof(_stream) ((_stream)->_flag & _IOEOF) #include <stdio.h> int main(void) { 	FILE *in, *out; 	int ch; 	if((in = fopen("input.txt","rb")) == NULL){ 		return 0; 	} 	while(!feof(in)) 	{ 		ch = fgetc(in); 		printf("%X  %d\n",ch,ch); 	} 	fclose(in); 	return 0; } 當(dāng)調(diào)用程序,input.txt文件中只有數(shù)字1;  輸出為: 31   49 FFFFFFFF (Z}2(BNFU0.jpg)  (Z}2(BNFU0.jpg) (Z}2(BNFU0.jpg)  (Z}2(BNFU0.jpg) 會發(fā)現(xiàn)多輸出了一個FFFFFFFF,原因就是在讀完最后一個字符后,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到文件結(jié)尾。直到再次調(diào)用fgetc()執(zhí)行讀操作,feof()才能探測到文件結(jié)尾。這樣就多輸出了一個-1(即FFFFFFFF)。  正確的寫法應(yīng)該是:  int c;  c = fgetc(fp);  while(!feof(fp))  {  		printf("%X  %d\n",ch,ch);  		c = fgetc(fp);  }  feof()可以用EOF代替嗎?不可以。fgetc返回-1時,有兩種情況:讀到文件結(jié)尾或是讀取錯誤。因此我們無法確信文件已經(jīng)結(jié)束, 因為可能是讀取錯誤! 這時我們需要feof()。 | 
|  | 
來自: 幸福的樂土 > 《計算機(jī)語言》