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

时间:2017-03-25 01:02:22

标签: c io 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] = '\0';

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

full_string = 0xa46df0 "\377\330\377", <incomplete sequence \340>

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

1 个答案:

答案 0 :(得分:0)

char *并不自动表示字符串。 C中的字符串是一个字节序列,存储在char *(或char []中,当它传递到某个地方时会衰减为char *,但让&#39 ; s认为那些答案是相同的)。这一系列字节必须以'\0'结束,即空字节,并且不在内部的任何位置包含它。

如果您在十六进制编辑器中打开该特定文件,您可能会看到FF D8 FF E0 00之类的内容,假设I(a)正确地进行了八进制 - 十六进制转换,并且(b)没有做任何其他愚蠢的错误。这在文件中有效,但如果您尝试将其解释为字符串 - 例如,使用strlen或GDB执行的操作 - 您将无法获得〜的预期值50000个字符,因为在第一个空字节之前小于约50000个字符。这也意味着终止你的&#34;字符串&#34; '\0'有点无意义;我的意思是,它不是一个字符串。它是一个字节序列。

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