在上一節例2中,程序從一個文件中逐個讀取字符並輸出到屏幕上顯示,在 while 循環中以 EOF 作為文件結束的標志。這種以 EOF 作為文件結束標志的文件,必須是文本文件。在文本文件中,數據都是以字符的 ASCII 碼值的形式存放。我們知道,ASCII 碼值的范圍是 0~255,不可能出現 -1,因此可以用 EOF 作為文件結束的標志。
當把數據以二進制形式存放到文件中時,就會有 -1 值的出現,此時不能采用 EOF 作為二進制文件的結束標志。為解決這一問題,ANSI C 提供一個 feof 函數,用來判斷文件是否結束。如果遇到文件結束,函數 feof(fp) 的值為 1,否則為 0。feof 函數既可以判斷二進制文件是否結束,也可以用來判斷文本文件是否結束。
例1 編寫程序,用於把一個文本文件(源文件)復制到另一個文件(目標文件)中。源文件名為 file_a.dat,目標文件名為 file_b.dat。
程序如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //聲明文件復制函數 5 void filecopy(FILE *fpin, FILE *fpout); 6 7 int main() 8 { 9 FILE *fpin, *fpout; 10 11 fpin = fopen("D:\\TEST\\file_a.dat", "r"); //打開輸入文件 12 if (fpin == NULL) 13 { 14 printf("Can't open this file !\n"); 15 exit(0); //使用exit函數,必須包含stdlib.h頭文件 16 } 17 18 fpout = fopen("D:\\TEST\\file_b.dat", "w"); //打開輸出文件 19 20 filecopy(fpin, fpout); //文件復制 21 22 //關閉輸入、輸出文件 23 fclose(fpin); 24 fclose(fpout); 25 return 0; 26 } 27 28 //定義 filecopy 函數 29 void filecopy(FILE *fpin, FILE *fpout) 30 { 31 char ch; 32 ch = getc(fpin); // 先讀一個字符,用 feof 函數判斷是否為空文件 33 //遇到文件結束標志,函數 feof(fp) 值為1,否則為0 34 while (!feof(fpin)) 35 { 36 putc(ch, fpout); 37 ch = getc(fpin); // 逐個字符進行復制 38 } 39 } View Code源文件:
目標文件: