【发布时间】:2021-01-30 11:09:28
【问题描述】:
我想编写一个 C 程序来读取 png 的像素值,而无需任何外部库(不包括用于解压缩的 zlib)。我研究了 png 的 Wikipedia page 并看到了一些 python tutorials 做同样的事情。
目前,我正在尝试将 png 的字节读入一个数组。目前,我正在使用this picture,它有一些黑点,我将使用这些黑点来验证最终数组中的像素坐标。但是,在打印检索到的数组时,我只得到了 png 的前四个字节:
ëPNG
当我询问数组的 sizeof() 并返回 4 时,我验证它实际上不是打印字节问题。我不明白这段代码有什么问题:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE *fp = fopen(argv[1], "rb");
unsigned char* file_data;
fseek(fp, 0, SEEK_END);
long int length = ftell(fp);
rewind(fp);
file_data = (char *)malloc((length+1)*sizeof(char));
fread(file_data, length, 1, fp);
printf("%s\n", file_data);
printf("%d\n", sizeof(file_data)/sizeof(file_data[0]));
fclose(fp);
return 0;
}
【问题讨论】:
-
sizeof指针与真实数组上的sizeof不同。前者只给出指针大小,而不给出它指向的内存缓冲区的大小。 -
即使在达到这一点之后,是什么让您认为 PNG 的原始文件格式可以作为终止的 C 字符串打印?
-
忽略
fread()的返回值,后果自负。如果您切换参数以使其为fread(file_data, 1, length, fp);,它会准确告诉您读取了多少(多少元素)
标签: arrays c image file binary