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

标签 c fread

我正在编写一个在不同客户端之间传输文件的程序,但我遇到了一个小问题。

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

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

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

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

我想 fread 在遇到某些东西时会停止读取,但我找不到是什么。

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

编辑:我正在通过

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

在接收中:

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

然后我就这样写了

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

最佳答案

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

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

关于c - 使用 fread 读取文件不会按预期结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23392435/

相关文章:

c - 如何重写程序,以便不必调用 `flex` 而只调用 `bison` 和 `cc` ?

c - 将一个字节写入C中的文件

c - 如何使用 C 中的结构创建数据库

c - 使用 C (Linux) 验证网络接口(interface)是否存在

c++ - RegLoadKey 给出错误代码 5(拒绝访问)

c - 如何修复编译器错误 ': warning: assignment makes integer from pointer without a cast'

c - 在 C 中使用 fread 读取整数时出错

python - 在C或其他编译器语言之前学习Python是一个好主意吗?

c - fread 段错误仅在少数情况下出现

c - 使用 fread 从文件中读取奇怪的文本