判斷文件結束函數 feof,判斷結束函數feof
在上一節例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。
程序如下:
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012110090137.gif)
![]()
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
源文件:
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012110090190.png)
目標文件:
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012110090158.png)