我正在尝试在存储卡中恢复JPG文件。在50个显示中,有49个按预期显示,但最后一个显示或不支持的文件格式也显示了"超出文件大小限制"的错误消息。有人可以告诉我为什么这是。下面的代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage: ./recover imagen");
return (1);
}
FILE * fileptr = fopen(argv[1], "r");
if (fileptr == NULL) {
fprintf(stderr, "Could not open image filen");
return (2);
}
unsigned char array[512] = {0};
int value = 0;
char filename[8] = "";
do {
value = fread(array, sizeof(array), 1, fileptr);
} while (!(array[0] == 0xff && array[1] == 0xd8 && array[2] == 0xff &&
(array[3] & 0xf0) == 0xe0));
int count = 0;
sprintf(filename, "%03i.jpg", count);
FILE * img = fopen(filename, "w");
while (value == 1) {
do {
fwrite(array, sizeof(array), 1, img);
value = fread(array, sizeof(array), 1, fileptr);
} while (!(array[0] == 0xff && array[1] == 0xd8 && array[2] ==
0xff && (array[3] & 0xf0) == 0xe0));
count = count + 1;
fclose(img);
sprintf(filename, "%03i.jpg", count);
img = fopen(filename, "w");
}
fclose(img);
fclose(fileptr);
return 0;
}
while( !(array[0] == 0xff && array[1] == 0xd8 && array[2] ==
0xff && (array[3] & 0xf0) == 0xe0));
代码是错误的。在找到一个对齐的标头之前,您不复制。您会复制标题说的字节数。鉴于您正在尝试恢复,即使它重叠了另一个图像,也应该在每个有效的标头处提取。
您正在考虑JPG在找到下一个JPG的开始之前结束。如果幸运的话,所有文件都将是连续的,并且所有文件都将是JPG,这就是除最后一个工作之外的所有文件。最后一个,显然没有下一个JPG文件,因此会失败。