读取图像文件内容到缓冲区

Reading image file contents to buffer

char* full_string;
int size;
FILE* f = fopen(filename,"r");

fseek(f,0,SEEK_END);
size = ftell(f);
fseek(f,0,SEEK_SET);
full_string = malloc(size+1);
fread(full_string,1,size,f);
fclose(f);

full_string[size] = '[=10=]';

我试图用上面的代码将文件的内容读入名为 "full_string" 的缓冲区,但是当我在 gdb 中单步执行时,我发现以下内容存储在 "full_string" 中相反:

full_string = 0xa46df0 "707", <incomplete sequence 0>

我是 C 的完全新手,所以我不知道如何解释这个问题。值得一提的是,我正在读取的文件是图像文件。大多数这些图像的大小为 50,000 字节或更大。任何帮助将不胜感激!

char * 并不自动表示字符串。在 C 中,字符串是字节序列,存储在 char *(或 char [] 中,当它传递到某个地方时会衰减为 char *,但让我们认为它们是相同的这个答案的事情)。该系列字节必须以空字节 '[=14=]' 结尾,并且在内部的任何位置都不包含它。

如果您在十六进制编辑器中打开该特定文件,您可能会看到类似 FF D8 FF E0 00 的内容,假设我 (a) 正确地进行了八进制 - 十六进制转换并且 (b) 没有进行任何转换其他愚蠢的错误。这在文件中是有效的,但如果您尝试将其解释为字符串——例如使用 strlen,或者 GDB 所做的——您将不会获得约 50000 个字符的预期值,因为更少在第一个空字节之前超过 ~50000 个字符。这也意味着用 '[=14=]' 终止你的 "string" 有点毫无意义;我的意思是,它 不是 字符串。这是一个字节序列。

如果长度很重要,您需要将其与它一起存储在结构或另一个变量中,具体取决于您的要求。