2013-03-29 70 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

相关问题