C 使用fread读取文件的结果并不像预期的那样

C 使用fread读取文件的结果并不像预期的那样,c,fread,C,Fread,我正在写一个在不同客户机之间传输文件的程序,我有一个小问题 我找到了一个不起作用的例子 我有一个pdf文件,我正在使用fread阅读它: bytes = fread(chunk, 1, BUFLEN - 1, from_file); 经过一点调试后,我发现这行代码不读取BUFLEN-1字节(顺便说一句,文件很大,我只迭代一次以获取第一个BUFLEN-1字节,因此文件的字节数超过BUFLEN-1字节)。fread的返回值实际上是BUFLEN-1,但将该块写入文件后,其大小要小得多 我想当遇到什么

我正在写一个在不同客户机之间传输文件的程序,我有一个小问题

我找到了一个不起作用的例子

我有一个pdf文件,我正在使用
fread
阅读它:

bytes = fread(chunk, 1, BUFLEN - 1, from_file);
经过一点调试后,我发现这行代码不读取
BUFLEN-1
字节(顺便说一句,文件很大,我只迭代一次以获取第一个
BUFLEN-1
字节,因此文件的字节数超过
BUFLEN-1
字节)。
fread
的返回值实际上是
BUFLEN-1
,但将该块写入文件后,其大小要小得多

我想当遇到什么东西时,
fread
会停止阅读,但我不知道是什么

我用“rb”打开了文件,所以这也不是问题所在。此外,我的程序似乎能很好地读取任何大小的文本文件,这就是为什么我认为它在查找不同类型的字节时会出现一些问题的原因

编辑:我正在通过

    send(socksv, chunk, strlen(chunk), 0);
在接收中:

    n = recv(i, chunk, BUFLEN - 1, 0);
然后我就这样写

    fwrite(chunk, 1, strlen(chunk), copy_file);

如果文件处于二进制模式,并且
fread()
表示它读取了
BUFLEN-1
字节,那么它确实读取了。您说您正在将读取的数据写入另一个文件,因此问题在于您的写入,而不是您的读取。但是,您没有显示该代码。

问题几乎肯定是使用了
strlen()
,因为当它看到一个零字节(几乎肯定会在PDF中)时,它将停止写入(套接字或文件)。您需要记住块的大小(由
fread()
返回)并将其用于写入


另外,请确保您正在检查
send()
的返回值,因为它只能发送您请求的缓冲区的一部分。

您是如何写入另一个文件的?此处信息不足。“我想fread在遇到某个问题时会停止读取”--您应该能够通过比较返回值和预期读取的字节数来找出位置。为什么不读取整个缓冲区长度?这引起了人们的怀疑,即您可能有一个1-off错误,因为您通常不使用null终止二进制数据。因为其中可能有一个零,所以您使用的
bytes
变量的类型是什么来存储
fread
的返回值?让我们看看:1。问题不是书面的,我已经查过了。正如预期的那样,返回值正好是BUFLEN-1,但字节数组小于3。这可能真的发生,我会把它挖出来。是的,问题是零字节。非常感谢你!