2010-07-28 143 views
1

我有一個函數,它將一個rom文件讀入內存,並自動分配以適應該文件,但每次我嘗試從文件描述符讀取時,fread()都會返回零。我不確定我做錯了什麼。任何人都可以幫忙嗎?fread返回零

int read_rom(const char *filename, unsigned char ***rom) { 
    int rom_size; 
    FILE *fd = NULL; 

    if((fd = fopen(filename, "r")) != NULL) { 
     fseek(fd, 0, SEEK_END); 
     rom_size = ftell(fd); 
     (*rom) = malloc(rom_size); 
     int read = fread(rom, 1, rom_size, fd); 
     fclose(fd); 

     printf("read: %d\n", read); 

     return rom_size; 
    } 

    return -1; 
} 

int main(int argc, char **argv) { 
    unsigned char rom_size = 0; 
    unsigned char **rom = NULL; 
    rom_size = read_rom(argv[1], &rom); 

    return 1; 
} 

任何接受者?

+0

當'fread'返回零時,您可以使用'feof'和'ferror'來調查whay。 – bta 2010-07-28 22:13:16

回答

12

您沒有閱讀任何內容,因爲您fseek編輯到文件末尾。在您fread之前,請fseek(fd, 0, SEEK_SET);返回到文件的開頭。

+1

或倒帶(),如果你願意 - 注意缺失的'f' – 2010-07-28 22:20:23

+0

哦jees,我忘了倒帶()...我必須失明。 非常感謝您指出了這一點。 – 2010-07-28 23:04:36

1

如果fread返回零,則或者文件結尾發生錯誤。

返回值

的fread()和fwrite()返回的項數成功讀取 或 書面(即,而不是字符數)。如果發生錯誤,則返回 或 達到文件結尾,返回值爲短項目數 (或 爲零)。 ()不區分文件結束和錯誤,並且調用者 必須使用feof(3)和ferror(3)來確定發生了哪一個。

我建議你應該檢查文件上的錯誤,如果發生錯誤,你應該打印相關錯誤信息以獲取更多信息!這應該是當前調試的一部分,但也可以是完成代碼的一部分,作爲錯誤處理。