微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

fwrite() 写入我期望的数量但不是我想要的数据

如何解决fwrite() 写入我期望的数量但不是我想要的数据

我的任务是从文件中复制 JPEG,这里的目的是找到 JPEG 并创建一个文件来放置它,所有 JPEG 都背靠背存储,并且“标识符”始终位于 512 字节的开头堵塞。 我的问题仅显示在第一个文件中,它在缓冲区中的预期数据之前写入 128 个字节,从而使新文件无用。

我尝试过的:

  • 检查原始文件,看看数据是否来自它,但它不是。
  • 将所有指针分配给“清除内存”。
  • 重新组织代码

有什么想法吗?

{

typedef uint8_t BYTE;
int ok=0;

if (argc !=2)
{
    printf("Usage: ./recover image\n");
    return 1;
}

FILE *data= malloc(sizeof(BYTE)*512);
data=fopen(argv[1],"r");

if (data==NULL)
{
    printf("cannot open file.\n");
    return 1;
}

BYTE *buff=malloc(sizeof(BYTE)*512);
char filename[7]="000.jpg";
int filecount=0;
FILE *write=malloc(sizeof(BYTE)*512);


while (fread(buff,sizeof(BYTE),512,data)==512)
{
    if (buff[0]==0xff && buff[1]==0xd8 && buff[2]==0xff && (buff[3] & 0xf0)==0xe0)
    {
        if (ok==1)
            fclose(write);

        if (filecount<10)
            sprintf(filename,"00%i.jpg",filecount);
        else
            sprintf(filename,"0%i.jpg",filecount);

        filecount++;
        ok=1;
        write=fopen(filename,"w");

    }

    if(ok==1)
        fwrite(buff,write);
}
fclose(write);

解决方法

由于 filename 仅足以容纳长度为 6 的字符串,因此您在整个代码中都有未定义的行为。使用:

char filename[64] = "000.jpg";

要保存长度为 7 的字符串,您必须有一个大小至少为 8 的缓冲区。(一个额外的用来保存终止 nul。)您也可以写 char filename[] = "000.jpg";,但没有必要吝啬这么小的数组。

还有,

FILE *write=malloc(sizeof(BYTE)*512);

显然是一个错误。我希望这只是一个剪切粘贴错误,但应该是:

FILE *write;
if( (write = fopen(filename,"w")) == NULL ){
        perror(filename);
        exit(EXIT_FAILURE);
}

此外,您可以使用以下方法简化递增名称的构造:

snprintf(filename,sizeof filename,"%03i.jpg",filecount++);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。