我正在尝试恢复存储卡中的jpg文件。 50个显示器中有49个按预期显示,但最后一个显示无效或不受支持的文件格式,还会显示错误消息“超出文件大小限制”。有人可以告诉我为什么吗。下面的代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
if (argc != 2)
{
fprintf(stderr, "Usage: ./recover image\n");
return (1);
}
FILE * fileptr = fopen(argv[1], "r");
if (fileptr == NULL) {
fprintf(stderr, "Could not open image file\n");
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;
}
答案 0 :(得分:3)
while( !(array[0] == 0xff && array[1] == 0xd8 && array[2] ==
0xff && (array[3] & 0xf0) == 0xe0));
代码错误。在找到对齐的标题之前,您不进行复制。您复制标头说明的字节数。鉴于您要恢复,因此即使每个有效标头与另一个图像重叠,也应该提取该标头。
答案 1 :(得分:3)
您正在考虑一个jpg刚好在找到下一个jpg的开始之前结束。如果幸运的话,所有文件将是连续的,所有文件将是jpg,这就是除了最后一个以外所有文件都能工作的原因。最后一个,显然没有下一个jpg文件,因此将失败。