在C语言中,fread函数如何知道文件已经读完?

16

我不太确定如何使用fread函数。我有一个小端格式的二进制文件需要转换为大端格式,但我不知道该如何读取文件。以下是我目前的代码:

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 “进展”,如果有帮助就感激不尽。


完成程序并运行它!fread将从上次循环停止的地方读取。您应该检查fread的返回值。infile不太可能等于EOF - luser droog
1
首先,“rb”表示Read Binary,因此您的数组应该是int类型,而不是char类型。 - MarcusJ
9
我不同意。数组应该是字符数组。二进制字符只有一个字节,而整数却有4个字节。因此,在这种情况下使用字符数组会更好,因为一个字符代表一个字节。 - Ian Leaman
1个回答

33

这不是在C语言中正确读取文件的方式。

fread会返回一个size_t类型的值,表示成功读取的元素个数。

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

if (file) {
    /* File was opened successfully. */
    
    /* Attempt to read */
    while (fread(buffer, sizeof *buffer, 4, file) == 4) {
        /* byte swap here */
    }

    fclose(file);
}

正如您所看到的,上面的代码会在 fread 提取了除 4 个元素以外的任何内容时停止读取。


4
我建议使用while (fread(buffer, 1, 4, file) == 4) { ... },以确保读取了4个字节,并避免使用未初始化的值导致的未定义行为。 - autistic
谢谢你提出这个问题。我刚意识到应该使用1作为大小,4作为计数。另外,兄弟,你的名字真棒! - user123
1
确实。我没有注意到这一点。我的评论是针对显式地将返回值与4进行比较,而不是0,因为如果fread返回3、2或1,则缓冲区中会有未初始化的字节,如果使用这些值,就会导致未定义的行为。 - autistic
但是如果文件只有4个字符呢? - space_mill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接