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

fwrite() writes the amount that i'm expecting but not the data that i want

我的任务是从一个文件中复制 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, sizeof(BYTE), 512, 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++);