feof()和EOF的用法—— C中檔案結尾的判斷

來源:互聯網
上載者:User

標籤:style   blog   color   io   ar   使用   sp   檔案   資料   

查看 stdio.h 可以看到如下定義:#define  EOF  (-1)#define  _IOEOF  0x0010 #define  feof(_stream)  ((_stream)->_flag & _IOEOF)由此可以看出,這兩種方式的原理是不同的。在這裡先說下EOF和feof()這個兩個宏定義,在我們學的課本中有這樣的描述。EOF是不可輸出字元,因此不能在螢幕上顯示。由於字元的ASCII碼不可能出現-1,因此EOF定義為-1是合適的。當讀入的字元值等於EOF時,表示讀入的已不是正常的字元而是檔案結束符,但這適用對文字檔的讀寫。在二進位檔案中,資訊都是以數值方式存在的。EOF的值可能就是所要處理的二進位檔案中的資訊。這就出現了需要讀入有用資料卻被處理為“檔案結束“的情況。為瞭解決這個問題,C提供了一個feof()函數,可以用它來判斷檔案是否結束。feof(fp)用於測試fp所指向的檔案的目前狀態是否為“檔案結束”。如果是,函數則返回的值是1(真),否則為0(假)。說了這兩個的定義,肯定還對二進位檔案和文字檔的區別有些模糊(唉,因為我當時就對這些搞不懂),那現在就回顧下這兩個檔案的概念。C語言支援的是流式檔案,它把檔案看作由一個一個的字元(位元組)資料群組成的序列。根據資料的組織和操作形式,可以分為ASCII檔案和二進位檔案。ASCII檔案又稱為文字檔,它是在一個位元組的儲存單元上存放一個字元(在外存中存放的是該字元的ASCII碼,每個字元將佔一個位元組)。二進位檔案是把記憶體中的資料按其在記憶體中的儲存格式在磁碟上原樣儲存。 對字元而言,由於其外存儲存格式和記憶體表示格式相同,所以,在外存上也存放每個字元的ASCII碼。但是說EOF只能用於文字檔,其實不然,這點不是特別的準確,還要看定義的變數的類型。下面這段程式對文字檔和二進位檔案都可以:int c;while((c=fgetc(fp)) != EOF){printf("%X/n", c); }如果讀到了FF,由於c定義為int型,所以實際上c=0x000000FF,不等於EOF(-1=0xFFFFFFFF),因此不會誤判為檔案結尾。但是如果把c定義為char類型,就有可能產生混淆了。char c;while((c=fgetc(fp)) != EOF){printf("%X/n", c); }因為文字檔中儲存的是ASCII碼,而ASCII碼中FF代表空值(blank),一般不使用,所以如果讀檔案返回了FF,說明已經到了文字檔的結尾。但是如果是二進位檔案,其中可能會包含FF,因此不能把讀到EOF作為檔案結束的條件,此時只能用feof()函數。在VC裡,只有當檔案位置指標(fp->_ptr)到了檔案末尾,然後再發生讀/寫操作時,標誌位(fp->_flag)才會被置為含有_IOEOF。然後再調用feof(),才會得到檔案結束的資訊。因此,如果運行如下程式:char c;while(!feof(fp)){c = fgetc(fp);printf("%X/n", c); }會發現多輸出了一個FF,原因就是在讀完最後一個字元後,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到檔案結尾。直到再次調用fgetc()執行讀操作,feof()才能探測到檔案結尾。這樣就多輸出了一個-1(即FF)。正確的寫法應該是:char c;c = fgetc(fp);while(!feof(fp)){printf("%X/n", c); c = fgetc(fp);}    

 

feof()和EOF的用法—— C中檔案結尾的判斷

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.