簡體   English   中英

混淆 == EOF 與 feof

[英]Confusion with == EOF vs feof

我打開了一個文件,在指針ptr的地址找到了流。 我正在嘗試查看文件是否為空白。 使用以下

if (fgetc(ptr) != EOF)

按預期工作。 當文件為空時,不執行語句。 當文件不為空時,不執行語句。

但是,使用

if (!feof(ptr))

總是執行語句。

為什么會這樣? 有沒有辦法使用feof函數?

有沒有辦法使用feof函數?

就在這里。 輸入函數返回一個表明它沒有更多輸入要處理的值后,您可以調用feof()和/或ferror()來確定該條件是由到達輸入末尾還是某些錯誤條件引起的。

這是feof()ferror()函數的唯一有效用途。

表明不再有輸入的結果因一個函數而異。 例如fgetc()返回值EOFfgets()返回一個空指針, fread()返回一個小於請求記錄數的值。 您需要閱讀每個輸入函數的文檔以了解它是如何工作的。

在 C 標准庫中,“文件結尾”不是獨立的自檢測條件。 “文件結束”只是前面讀取操作設置的文件狀態。 直到您執行讀取操作並且直到讀取操作碰到文件的實際末尾,“eof”狀態才被設置並且feof()返回 0。

C 標准庫中的許多(大多數)標准 I/O 函數已經返回了一些可用於檢測“文件結束”條件的完成代碼(如fgetc()返回EOF值)。 這意味着大多數時候調用feof()是不必要的。

換句話說,如果您將“文件結尾”視為一堵磚牆,那么在 C 標准庫中,僅僅站在那堵牆的正前方檢測它是不夠的。 為了發現它的存在,有必要用你的前額實際撞到那堵牆。

當您打開一個空文件時,您會從“牆前”的狀態開始。 此時尚未檢測到“文件結束”條件。 你必須嘗試閱讀一些東西才能撞到那堵牆上,從而檢測到它的存在。

這種設計的原因是完全合乎邏輯的。 C 語言旨在支持各種輸入流和文件系統,包括 1) 根本不存儲文件大小的文件系統,以及 2) 只知道近似文件大小的文件系統(如四舍五入到最近的集群)。 在此類文件系統中,文件的結尾通常由特殊標記指定。 在讀取文件時遇到該標記之前,您不知道該標記在哪里。 (出於同樣的原因,C 流不保證在fseek函數中支持從SEEK_END原點定位。)

正如@Barmar 在評論中指出的那樣,沒有預先確定的“文件結尾”位置的輸入流的更好示例是鏈接到終端的標准輸入。

feof(f)在您打開文件后將始終返回false ,因為 if 為您提供了一個標志的值,該標志初始化為 false 並僅在至少一個讀取操作失敗后才設置為 true。

你可以像這樣使用feof

fgetc(fp);
if (feof(fp))
  ...

feof在嘗試讀取文件末尾或文件末尾之后檢查文件末尾指示符集。 它在您無法控制的代碼正在從文件中讀取的情況下很有用,並且您希望在文件耗盡后停止處理。

遲到的答案,但是添加一個有用的引用來自 Stephen Kochan 的Programming in C (4th Edition),p。 367:

請記住, feof()告訴您已嘗試讀取文件末尾之后的內容,這告訴您剛剛從文件中讀取最后一個數據項不同。 您必須讀取feof()的最后一個數據項才能返回非零值。

斜體我的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM