您好我正在尝试读取二进制文件并处理它但我认为我正在使用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
答案 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}}也是不必要的,但这与您的问题无关。