使用fread读取文件并不会按预期结束

时间:2014-04-30 15:41:06

标签: c fread

我正在编写一个程序,用于在不同客户端之间传输文件,我有一点问题。

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

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

bytes = fread(chunk, 1, BUFLEN - 1, from_file);

经过一些调试后我发现这行代码没有读取BUFLEN - 1个字节(哦顺便说一下,文件很大,我只迭代一次才能获得第一个BUFLEN - 1字节,因此该文件的字节数超过BUFLEN - 1fread的返回值实际上是BUFLEN - 1,但在将此块写入文件后,它的大小要小得多。

我认为fread在遇到某些事情时会停止阅读,但我无法找到答案。

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

编辑:我通过

发送块
    send(socksv, chunk, strlen(chunk), 0);

收到:

    n = recv(i, chunk, BUFLEN - 1, 0);

之后我就这样写了

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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