C-如何修复显示显示的文件大小限制显示显示的消息



我正在尝试在存储卡中恢复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文件,因此会失败。

最新更新