linux - 执行fread函数出现问题

浏览:31日期:2023-03-16

问题描述

执行fread函数成功后,返回的值是等于data_len。但是执行strlen后,字符串buff的长度不对。但是我用fwrite将图片写到另一个.jpg是OK的

int main(){ FILE *fp,*out; int c,len; out=fopen('out.jpg','wb'); if((fp=fopen('/home/jens/Desktop/picture.jpg','rb'))<0){printf('error openn'); } if(fp == NULL) printf('Open file Error!'); fseek(fp,0,SEEK_END); int data_len=ftell(fp); printf('datalen %d',data_len); rewind(fp); char* buff=(char *)malloc((data_len)*sizeof(char)+1); size_t a=fread(buff,sizeof(char),data_len,fp); printf( 'n a %d',a); //a的值是图片的大小 len=strlen(buff);printf('n len %d',len);//在这里buff的大小却只是4。 char* HTTP_INFO=(char *)malloc((data_len)*sizeof(char)+1024); char *buf='abcdefg'; printf('n %d',strlen(buf)); len=sprintf(HTTP_INFO,'%s',buf);//如果把这个换成buff,结果也还是4。 printf('nlen %d',len); fclose(fp); fclose(out); return 0;}

运行的结果如下图linux - 执行fread函数出现问题

问题解答

回答1:

strlen的作用是遍历一个char*,如果找到0x00(所谓结束符’0’)就认为字符串结束,并返回遍历了多少个字符。你读取一个jpg文件,有很大概率在第5个字节上出现0x00,那么strlen当然只能读到4个字节。不信你可以用xxd out.jpg看一下二进制字节。

回答2:

C语言吧0看作字符串的结尾。。。简单来说,strlen的实现大概是:

int strlen(char *p){ int c=0; while(*(p++)) c++; // p[c] != 0 return c; }

而 rb 读取出来的结果可以认为是uint8的数组,即0~255的数组。

对于JPEG,你应该知道APP0的第一个字段是本字段长度0x00,0x10

相关文章: