fwrite() 写入我期望的数量而不是我想要的数据
fwrite() writes the amount that i'm expecting but not the data that i want
我的任务是从一个文件中复制 JPEG,这里的目的是找到 JPEG 并创建一个新文件来放置它,所有的 JPEG 都是背靠背存储的,“标识符”总是在一个文件的开头512 字节块。
我的问题只显示在第一个文件中,它在缓冲区的预期数据之前写入 128 个字节,使新文件无用。
我尝试过的:
- 检查原始文件以查看数据是否来自它,但事实并非如此。
- Malloc 所有指针以“清除内存”。
- 重组代码。
有什么想法吗?
{
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++);
我的任务是从一个文件中复制 JPEG,这里的目的是找到 JPEG 并创建一个新文件来放置它,所有的 JPEG 都是背靠背存储的,“标识符”总是在一个文件的开头512 字节块。 我的问题只显示在第一个文件中,它在缓冲区的预期数据之前写入 128 个字节,使新文件无用。
我尝试过的:
- 检查原始文件以查看数据是否来自它,但事实并非如此。
- Malloc 所有指针以“清除内存”。
- 重组代码。
有什么想法吗?
{
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++);