使用fread和fwrite ..数据丢失

时间:2012-10-30 06:25:15

标签: c

您好我正在尝试读取二进制文件并处理它但我认为我正在使用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

3 个答案:

答案 0 :(得分:4)

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

尝试翻转以读取“多个字节”而不是“1个LINE_MAX字节块”:

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

答案 1 :(得分:2)

因为您要求LINE-MAX大小的块,如果文件大小不是该值的完全倍,您将无法获得最后一个块。 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.
    }
}

答案 2 :(得分:1)

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

fwrite()来电中的{{1}}也是不必要的,但这与您的问题无关。