2013-03-29 116 views
5

所以我不完全確定如何使用fread。我有一個小端的二進制文件,我需要轉換成big-endian,而且我不知道如何讀取文件。以下是我迄今爲止:fread如何知道C文件何時結束?

FILE *in_file=fopen(filename, "rb"); 
char buffer[4]; 
while(in_file!=EOF){ 
    fread(buffer, 4, 1, in_file); 
    //convert to big-endian. 
    //write to output file. 
} 

我沒有寫任何東西,但我只是不知道如何讓FREAD以「進步」,可以這麼說。任何幫助,將不勝感激。

+0

完成程序並運行它! 'fread'將從最後一次循環中的位置讀取。你應該檢查'fread'的返回值。 'infile'不可能與'EOF'相比較。 –

+4

取得進展的第一步是**閱讀文件**。 –

+1

首先,「rb」表示** R ** ead ** B ** inary,所以您的數組應該是int類型的,而不是char。 – MarcusJ

回答

13

那不是你如何正確地從一個文件中C.

fread讀返回表示元素的數量size_t成功讀取。

FILE* file = fopen(filename, "rb"); 
char buffer[4]; 

if (file) { 
    /* File was opened successfully. */ 

    /* Attempt to read */ 
    while (fread(buffer, 1, 4, file) == 4) { 
     /* byte swap here */ 
    } 

    fclose(file); 
} 

正如你所看到的,上面的代碼將停止儘快閱讀作爲fread提取除4種元素的任何其他。

+2

爲了確保讀取4個字節並避免使用未初始化值的未定義行爲,我建議'while(fread(buffer,1,4,file)== 4){...}。 – Sebivor

+0

感謝您的支持。我剛剛意識到我應該使用1的大小和4的數量。另外,真棒名字兄弟! –

+0

確實。然而,我沒有注意到。我的意見是關於顯式比較返回值爲4而不是0,因爲如果fread返回3,2或1,那麼緩衝區中會有未初始化的字節,如果使用這些值,將導致未定義的行爲。 – Sebivor

相關問題