0

嗨,我正在尝试读取二进制文件并对其进行处理,但是当我尝试使用 fread 时,我认为我使用 fread 的方式错误。读取的字节数小于文件的大小。谁能帮帮我,白我做错了

    #include <stdio.h>
    #include <limits.h>

    int main()
    {

    FILE *fin=fopen("./file.pcap","rb");

    char line[LINE_MAX];

    FILE *fout=fopen("out.txt","w");

    while(fread(line,sizeof(line),1,fin)){
        fwrite(&line,sizeof(line),1,fout);
    }

    fclose(fin);
    fclose(fout);

    }

第一个文件大约是 51236,out.txt 是 51200

4

3 回答 3

5

Fread 返回读取的“元素”数。你说过一个元素是LINE_MAX字节长,所以当你到达文件末尾时,没有一个完整的元素适合你,所以fread()返回 0 并且你的输出最终被截断。

尝试翻转读取“一些字节”而不是“1块LINE_MAX字节”:

size_t numBlocks;
while((numBlocks = fread(line, 1, sizeof(line), fin)) > 0) {
    fwrite(line, 1, numBlocks, fout);
}
于 2012-10-30T06:31:00.830 回答
2

因为您要求的是LINE-MAX-sized 块,所以如果文件大小不是该值的精确倍数,您将不会得到最后一个。fread返回它读取的完整块的数量。你最好使用类似的东西:

size_t sz;
while ((sz = fread (line, 1, sizeof (line), fin)) > 0) {
    fwrite (line, sz, 1, fout);
}

这将从输入文件中读取任意数量的数据(最多LINE_MAX),然后将该大小的块写入输出文件。这样做是因为,不是说一个大小的块LINE_MAX,而是指定LINE_MAX每个字节的块。这样,如果LINE_MAX文件中没有字符,fread将尽可能多地为您提供。

文件结尾将导致fread返回零,任何其他值表示数据已成功读取。

顺便说一句,您还应该检查fwrite. 您不必为那个交换参数,但您应该确保返回值是1(或者sz如果您确实交换了参数)。否则,数据不一定全部写入。

换句话说:

size_t sz;
while ((sz = fread (line, 1, sizeof (line), fin)) > 0) {
    if (fwrite (line, sz, 1, fout) != 1) {
        // Handle error.
    }
}
于 2012-10-30T06:31:37.980 回答
1

你已经接近了,但是当它在你的输入文件末尾获得部分缓冲区时fread()会返回。0您需要添加一些代码来处理这种情况,否则您将跳过写出这些字节。

&您的电话中的 thefwrite()也是不必要的,但这与您的问题无关。

于 2012-10-30T06:28:19.113 回答