EDX CS50x PSET3 restore.c (восстановленное изображение не соответствует: применяется только к файлу 049.jpg) - PullRequest
0 голосов
/ 17 марта 2019

Я застрял в этой проблеме:

Результат: :) recovery.c существует. :) recovery.c компилирует. :) справляется с отсутствием криминалистического изображения :) восстанавливает 000.jpg правильно :) восстанавливает средние изображения правильно :( восстанавливает 049.jpg правильно восстановленное изображение не соответствует

Файл компилируется правильно, и все 50 файлов .jpg понятны, однако есть небольшая проблема с последним файлом (049.jpg: восстановленное изображение не совпадает), и я просто не могу выяснить причину.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
    // ensure 1 command-line argument:
    if(argc != 2)
    {
        fprintf(stderr, "Usage: name of forensic image from which to recover JPEGs");
        return 1;
    }
    // open the memory card file:
    FILE *file = fopen(argv[1], "r");
    if (!file)
    {
        fprintf(stderr, "Could not open %s.\n", argv[1]);
        fclose(file);
        return 2;
    }
    //fseek(file, 0, SEEK_SET);
    unsigned char buffer[512];
    char* filename = malloc(50 * sizeof(int));
    if (!filename)
    {
        return 3;
    }
    bool jpeg_found = false;
    int f = 0;
    int n = 0;

    while (!(feof(file)))
    {
        sprintf(filename, "%03i.jpg", f);
        FILE *img = fopen(filename, "w");
        if (!filename) return 6;
        if (f > 0) fwrite(buffer, 1, 512, img);
        n = 0;

        while (n == 0)
        {
            if (feof(file))
            {
                fclose(img);
                break;
            }
            fread(buffer, 1, 512, file);    //read 512 bytes into a buffer
            if (buffer[0] == 0xff &&        // start of a new JPEG?
            buffer[1] == 0xd8 &&
            buffer[2] == 0xff && (
            buffer[3] & 0xf0) == 0xe0)
            {
                if (jpeg_found) // have you already found a JPEG or not?
                {
                    // YES: close the previous file and open a new one,
                    fclose(img);
                    f += 1;
                    n = 1;
                }
                else // NO: start very 1st JPEG
                {
                    fwrite(buffer, 1, 512, img);
                    jpeg_found = true;
                }
            }
            else
            {
                if (jpeg_found) // Have your already found a JPEG or not?
                {
                    // YES: Those 512 bytes belong to the current opened JPEG file
                    fwrite(buffer, 1, 512, img);
                }
                else  // NO: Discard the 512 bytes and go to the start of the loop
                {
                    continue;
                }
            }
        }
    }
    free(filename);
    fclose(file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...