网络分配存在一些问题。最终目标是让一个 C 程序通过 HTTP 从给定的 URL 抓取文件并将其写入给定的文件名。对于大多数文本文件来说,它都能正常工作,但我遇到了一些问题,我怀疑这些问题都来自相同的根本原因。
这是我用来将数据从网络文件描述符传输到输出文件描述符的代码的快速版本:
unsigned long content_length; // extracted from HTTP header
unsigned long successfully_read = 0;
while(successfully_read != content_length)
{
char buffer[2048];
int extracted = read(connection,buffer,2048);
fprintf(output_file,buffer);
successfully_read += extracted;
}
正如我所说,这对于大多数文本文件都适用(尽管 % 符号会混淆 fprintf,所以最好有一种方法来处理它)。问题是,当我尝试获取非文本文件时,它会永远挂起(.png 是我正在使用的基本测试文件,但程序需要能够处理任何内容)。
我已经做了一些调试,我知道我不会超过 content_length、在读取过程中出现错误或遇到某些网络瓶颈。我在网上查了一下,但我能找到的所有二进制文件的 C 文件 i/o 代码似乎都是基于这样的想法:您知道文件内的数据是如何构造的。我不知道它是如何构造的,我也不在乎;我只想将一个文件描述符的内容复制到另一个文件描述符中。
任何人都可以向我指出一些内置文件 I/O 函数,我可以强行使用这些函数来实现此目的吗?
编辑:或者,HTTP header 中是否有一个标准字段可以告诉我如何处理我正在使用的任何文件?
最佳答案
您使用了错误的工具来完成这项工作。 fprintf
接受格式字符串和额外参数,如下所示:
fprintf(output_file, "hello %s, today is the %d", cstring, dayoftheweek);
如果您从未知来源(例如您正在执行的网络)传递第二个参数,您可能会意外地拥有 %s
或 %d
或其他格式说明符在字符串中。然后,fprintf
将尝试读取比传递的参数更多的参数,并导致未定义的行为。
为此使用fwrite
:
fwrite(buffer, 1, extracted, output_file);
关于未知文件类型的 C 文件输入/输出 : File Copying,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049785/