簡體   English   中英

fseek在EOF之外的位置不會觸發使用feof的EOF,為什么會這樣?

[英]fseek on a position beyond EOF does not trigger EOF using feof, how come?

我正在從一個文件讀取數據到打開的內存:

FILE *f = fopen(path, "rb");

在我開始從文件中復制字節之前,我使用以下方法尋找起始位置:

/**                                                                                                                                                    
 * Goes to the given position of the given file.                                                                                                       
 *                                                                                                                                                     
 * - Returns 0 on success                                                                                                                              
 * - Returns -1 on EOF                                                                                                                                 
 * - Returns -2 if an error occured, see errno for error code                                                                                          
 * - Returns -3 if none of the above applies. This should never happen!                                                                                
 */                                                                                                                                                    

static int8_t goto_pos(FILE *f, uint64_t pos)                                                                                                          
{                                                                                                                                                      
        int err = fseek(f, pos, SEEK_SET);                                                                                                             

        if (err != 0) {                                                                                                                                
                if (feof(f) != 0) return -1;                                                                                                           
                if (ferror(f) != 0) return -2;                                                                                                         
                return -3;                                                                                                                             
        }                                                                                                                                              

        return 0;                                                                                                                                      
}

問題在於,即使我尋求超出EOF的位置,此函數也不會返回-1。

根據參考,當遇到EOF時, feof應返回非零值。

為什么是這樣? feof功能無用嗎?


請注意,我目前正在使用fgetc的返回值來檢查EOF

尋求根本不測試文件的結束。

這樣做的原因是你可能想要在你想要的地方做一個fwrite() fseek()在調用之后無法知道你的計划是什么。

在文件結束后搜索后執行fread() ,你將得到feof()返回非零值。

feof()在嘗試讀取失敗后設置,所以fgets()fread()之前。

在EOF之后尋求將在后續寫入之后放大文件,因此這符合其他人的信念。 見這里: fseek

fseek()函數應允許將文件位置指示符設置為超出文件中現有數據的末尾。 如果此時稍后寫入數據,則后續讀取間隙中的數據將返回值為0的字節,直到數據實際寫入間隙。

這就是fseek無法返回EOF的原因。 如果您嘗試從以前沒有任何內容寫入該位置或后面的位置讀取,您將稍后獲得EOF。 所以這是正確的行為。

在某些操作系統上查找超出文件末尾會增加文件的大小。 只要有足夠的空間使文件變大,它就永遠不會返回錯誤。

暫無
暫無

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

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