如何修复显示的文件大小限制错误消息

时间:2019-05-06 14:01:49

标签: c cs50

我正在尝试恢复存储卡中的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;
}

2 个答案:

答案 0 :(得分:3)

while( !(array[0] == 0xff && array[1] == 0xd8 && array[2] == 
               0xff && (array[3] & 0xf0) == 0xe0));

代码错误。在找到对齐的标题之前,您不进行复制。您复制标头说明的字节数。鉴于您要恢复,因此即使每个有效标头与另一个图像重叠,也应该提取该标头。

答案 1 :(得分:3)

您正在考虑一个jpg刚好在找到下一个jpg的开始之前结束。如果幸运的话,所有文件将是连续的,所有文件将是jpg,这就是除了最后一个以外所有文件都能工作的原因。最后一个,显然没有下一个jpg文件,因此将失败。