Как исправить сообщение об ограничении размера файла? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь восстановить файл jpg на карте памяти. 49 из 50 отображают, как ожидается, но последний отображает недопустимый или неподдерживаемый формат файла, а также отображается сообщение об ошибке «Превышен предел размера файла». может кто-то любезно сказать мне, почему это так. код ниже

#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 ]

3 голосов
/ 06 мая 2019

Вы считаете, что JPG заканчивается непосредственно перед началом следующего найденного JPG.Если вам повезет, все файлы будут последовательными, и все файлы будут в формате jpg, и это причина того, что все, кроме последнего, работают.Последний, очевидно, не имеет следующего jpg-файла и поэтому потерпит неудачу.

3 голосов
/ 06 мая 2019
while( !(array[0] == 0xff && array[1] == 0xd8 && array[2] == 
               0xff && (array[3] & 0xf0) == 0xe0));

Код неверный. Вы не копируете, пока не найдете выровненный заголовок. Вы копируете количество байтов, которое говорит заголовок. Если вы пытаетесь восстановить, вы должны извлекать каждый действительный заголовок, даже если он перекрывает другое изображение.

...