CS50 Recover запускается и восстанавливает все файлы, кроме первого

Мой вопрос касается задания «Восстановление» в рамках 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;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
237
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Большое спасибо, наличие if {} else {} имеет смысл! Я понял это сейчас.

Leona 10.04.2019 06:57

Другие вопросы по теме