feof的原理和用法

一、feof的定義

feof()是檢測流上的文件結束符的函數,如果文件結束,則返回非0值,否則返回0;
原型:int feof ( FILE * stream );
一般在操作中,經常用feof()判斷文件是否結束。檢查是否設置了與流關聯的文件結束指示符,如果返回,則返回一個不同於零的值。該指示符通常由嘗試在文件末尾讀取的流上的先前操作設置。注意,流的內部位置指示符可能指向下一個操作的文件結尾,但是,直到操作試圖在該點讀取之前,文件結尾指示符可能才被設置。可以通過調用clearerr,倒帶,fseek,fsetpos或freopen清除此指示符。儘管如果這樣的調用未重新定位位置指示器,則下一個I / O操作可能會再次設置指示器。

二、經典用法

* feof example: byte counter */
#include <stdio.h>

int main ()
{
  FILE * pFile; //用於存儲文件地址
  int n = 0;  //計數
  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL) perror ("Error opening file");
  else
  {
    while (fgetc(pFile) != EOF) {
      ++n;
    }
    if (feof(pFile)) {
      puts ("End-of-File reached.");
      printf ("Total number of bytes read: %d\n", n);
    }
    else puts ("End-of-File was not reached.");
    fclose (pFile);
  }
  return 0;

功能分析:此代碼將打開名爲myfile.txt的文件,並通過逐個讀取所有字符來計算其中包含的字符數。程序檢查是否到達文件末尾,如果達到,則打印讀取的字節總數。

三、經典錯誤

#include<stdio.h>
int main(void)
{
    FILE *p;
    p = fopen("open.txt", "r");
    if (feof(p))
    {
        printf("文件爲空。");
    }
    else
    {
        printf("文件不爲空。");
    }
    return 0;
 }

**分析:**根據這個函數的定義,一般大家都是這樣使用的,但是這樣使用,文件中無論是否有內容,都會被判斷爲“文件不爲空”(跟文件打開方式也有關)。

四、feof()原理

1.EOF(宏定義)

EOF是一個計算機術語,爲End Of File的縮寫,在操作系統中表示資料源無更多的資料可讀取。
資料源通常稱爲檔案或串流。通常在文本的最後存在此字符表示資料結束。

在文檔的結尾都有一個隱藏字符”EOF”,當程序讀取它的時候,就會知道文件已經到達結尾。通常使用while循環加EOF判斷作爲讀取結束的標誌。

EOF 的值通常爲 -1,但它依系統有所不同。

2.feof()

  1. feof()原理函數:,並不是通過讀取到文件的EOF來評判,這個文件是否爲空。對feof()來說,它的工作原理是,站在光標所在位置,向後看看還有沒有字符。如果有,返回0;如果沒有,返回非0。它並不會讀取相關信息,只是查看光標後是否還有內容。
  2. 直接使用時:對於一個空文件來說,當程序打開它的時候,它的光標會停在文件的開頭,但是由於文件裏什麼內容都沒有存(但是EOF是存在的),即整個文件就存貯了一個EOF。當程序打開文件,並直接調用feof()時,這個函數就會站在光標的位置向後張望,結果就看見了EOF,然後就當然返回0了。

五、上程序改正

#include<stdio.h>
int main(void)
{
    FILE *p;
    p = fopen("open.txt", "r");
    getc(p);
    if (feof(p))
    {
        printf("文件爲空。");
    }
    else
    {
        rewind(p);//將光標跳回到文件開頭
        int a;
        fscanf(p,"%d",&a);
        printf("%d", a);
    }
    return 0;
 }

總結:

  1. 對於文件來說,無論是空文件,還是存有信息的文件,當文件被打開,光標處於默認的開頭時,光標後都有信息,這時候調用feof()來查看光標後是否還有內容,就沒意義。
  2. 所以我們需要從相同中找不同,先使用getc(),從文件中讀取一個字符,讓光標向後移動一個字符。這時空文件的光標就已經移動到EOF的後面,這時使用feof()就會返回1了。這纔是feof()的正確用法。
  3. 但是要注意,一定要將光標回到文件的開頭,因爲之前判斷文件是否爲空時,將光標向前移動了一位,必須要將光標恢復到開頭,這樣才能保證文件的正常讀取。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章