linux - 执行fread函数出现问题
伊谢尔伦
伊谢尔伦 2017-06-07 09:24:30
[C++讨论组]

执行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 open\n");
    }
    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;
}

运行的结果如下图

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
滿天的星座

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

伊谢尔伦

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号