【问题标题】:reading an image file into a char array将图像文件读入 char 数组
【发布时间】:2011-08-17 04:33:15
【问题描述】:

我正在尝试将一堆文件读入一个 char 数组, 我有以下代码

FILE* file = fopen("...","rb");
//some error checking stuff
fseek(file, 0, SEEK_END);
long len=ftell(file);
fseek(file, 0, SEEK_SET);           
char* content=(char *)malloc(len+1);
memset(content,0,len+1);
fread(content, len, 1, file);

我用一个文本文件对此进行了测试,这似乎可行。我在我的数组中获得了文件的内容,一切都很好。但是如果这段代码使用图像文件运行(我测试了 pngs 和 jpegs),这似乎只读取了文件的前几个字节。我这里有什么遗漏吗?

【问题讨论】:

  • 你如何验证读取了多少字节?
  • 您是否尝试执行 printf 来确定只显示前几个字节?
  • @Niraj 这是一个 CGI 应用程序吗?如果是这样,您必须在数据输出开始时在标头中发送正确的 MIME 类型; Content-type:image/png 在 png 数据的情况下。
  • 您如何将字节发送回浏览器? fprintf 还是 fwrite?如果您只是要填充缓冲区并且不需要malloc 上的演员表,则无需memset。此外,您不需要在用作字节缓冲区的char*(实际上应该是unsigned char *)上使用空终止符,这仅对字符串需要。为什么不使用statfstat 而不是四处寻找某物有多大?
  • @mu fseek() 很好,它是标准的 ANSI C,而 fstatstat 不是。 @Niraj fseek(file, 0, SEEK_SET); 可以替换为 rewind(file);,这可能更详细、更清晰。

标签: c arrays image file-io


【解决方案1】:

如果您查看definintion of fread,那么您的 fread 不可能只返回前几个字节,因为您将 len 放入 size 字段并传递了 1。这意味着 fread 将成功返回 1读取 len 个字节,否则将无法读取任何字节。如果您交换参数,则 fread 将读取尽可能多的字节,并将返回它实际读取的字节数(成功时应为 len)。

还请注意,执行 memset 0 然后 freading 效率低下,除非您要求数组在失败时归零(错误情况应该意味着您不必这样做)。添加空终止符的更好方法(就像您对普通文件所做的那样)是:

content[len] = '\0';

【讨论】:

  • 是的,fread 确实阅读了整个内容。如 cmets 所述,我在套接字发送函数的参数中出错。因此,尽管 fread 给了我一切,但我只发送了前几个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2015-07-11
  • 2012-10-20
  • 2017-01-20
相关资源
最近更新 更多