CS50 Recover запускает и восстанавливает все файлы, кроме первого - PullRequest
0 голосов
/ 09 апреля 2019

Мой вопрос касается задания Восстановить как часть CS50.

Код выполняется (наконец) и создает 50 файлов JPEG, и большинство из них являются правильными изображениями, за исключением того, что первый файл не является изображением, поэтому он не проходит проверку 50.

Я потратил много времени, пытаясь выяснить, в чем проблема, но я не могу точно определить ее, поэтому я надеюсь, что кто-то сможет мне помочь, чтобы я мог двигаться дальше.

Заранее спасибо!Вот мой код:

    int main(int argc, char *argv[])
    {
    // ensure proper usage
    if (argc != 2)
    {
        fprintf(stderr, "Usage: Name of Memory Card File\n");
        return 1;
    }

    char *readfile = argv[1];

    // open memory card file
    FILE *card_ptr = fopen(readfile, "r");
    if (card_ptr == NULL)
    {
        fprintf(stderr, "Could not open %s.\n", readfile);
        return 2;
    }

    //Declare a buffer to read into
    unsigned char *buffer = malloc(512);

    //to check if we have already found a file
    bool (jpgAlreadyNew) = false;

    //declare counter for the number of files found and a file pointer
    int filenumber = 0;
    FILE *new_jpg_ptr = NULL;
    char filename[8];

    //read in bytes until reach EOF
    while (fread(buffer, 1, 512, card_ptr) != 0x00)
    {
        //if we reach the header pattern of bytes
        if (buffer [0] == 0xff && buffer [1] == 0xd8 && buffer [2] == 0xff && (buffer [3] & 0xf0) == 0xe0)
        {

            //if there is not already a JPEG file found
            if (!jpgAlreadyNew)
            {
                //change the bool value
                (jpgAlreadyNew) = true;

                //open new file
                sprintf(filename, "%03i.jpg", filenumber);
                new_jpg_ptr = fopen(filename, "w");
                if (new_jpg_ptr == NULL)
                    {
                        return 3;
                    }
                //add to counter of files found
                filenumber++;

                //write files from buffer into new img file
                fwrite(buffer, 1, 512, new_jpg_ptr);

            }

            //if there is already a JPEG file found
            if (jpgAlreadyNew)

            {
                //close the previous file which would now be complete
                fclose(new_jpg_ptr);

                //open new file
                sprintf(filename, "%03i.jpg", filenumber);
                new_jpg_ptr = fopen(filename, "w");
                if (new_jpg_ptr == NULL)
                    {
                        return 4;
                    }
                //add to counter of files found
                filenumber++;

                //write files from buffer into new img file
                fwrite(buffer, 1, 512, new_jpg_ptr);

            }

        }

        // else if we do not see pattern of header bytes
        else
        {
            //if already found a jpg file which is open then write the bytes to that file
            if (jpgAlreadyNew)
              {
                  fwrite(buffer, 1, 512, new_jpg_ptr);
              }
            //if no file found yet, discard and move on
            if (!jpgAlreadyNew)
              {
                  continue;
              }
        }
    }

    //free memory
    free (buffer);

    //close pointers and end program successfully
    fclose(card_ptr);
    fclose(new_jpg_ptr);
    return 0;
}

1 Ответ

0 голосов
/ 09 апреля 2019

Давайте пройдемся по программе, начиная с поиска первой сигнатуры jpeg:

Это if (!jpgAlreadyNew) оценивается как true, поэтому оно входит в блок if;первое, что он делает, это (jpgAlreadyNew) = true;.Когда это будет сделано, создав файл и записав первый блок, что будет дальше?Это if (jpgAlreadyNew).Что также оценивается как истина.Таким образом, он закрывает 000.jpg и движется вперед.

Поскольку jpgAlreadyNew является логическим значением, достаточно конструкции if {} else {}.

...