我正在尝试读取JPEG文件并将其作为HTTP POST请求标头的一部分存储在C中的缓冲区中,然后使用HTTP POST上传到服务器。但似乎它只读取图像数据的前4个字节,因为在服务器端我只获得图像的前4个十六进制字符。我的代码出了什么问题?操作系统是LINUX。
我意识到在IMAGE的第五个HEX上,它的0x00,我认为C将其解释为终结符,或者它只是认为文件在这里停止...如何避免这个问题?
unsigned long fileLen;
char *buffer;
if ((fp = fopen(filename, "rb")) == NULL){
printf("File could not be opened\n");
exit(1);
}else{
fseek(fp, 0, SEEK_END);
fileLen=ftell(fp);
fseek(fp, 0, SEEK_SET);
buffer=(char *)malloc(fileLen);
fread(buffer, fileLen, 1, fp);
fclose(fp);
}
答案 0 :(得分:0)
buffer
是一个char *
,指向一个char的指针,所以你得到你机器上指针的大小(4个字节,你运行的是32位,对吧?)。
fread
的返回值是读取的字节数,我建议你使用它。
0x00
只是C中字符串的分隔符,在这种情况下不相关。
顺便说一下,您可能希望考虑输入一些错误处理。如果ftell
失败,则返回-1,然后在malloc
中使用。然后这将失败并返回NULL,您将在fread
中将其用作第一个参数。这会给你一个SIGSEGV分段违规,即你的程序崩溃。
编辑:如果你有一个非常大的文件,可能是另一个问题。您寻求文件结束以获取其大小(请考虑使用fstat
),但如果文件大小超过最大堆大小,该怎么办?例如一个2千兆字节的文件?这将导致malloc
失败并返回NULL。