问题描述
我的任务是从文件中复制 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++);