CS50 RECOVER Ищем условие для итерации - PullRequest
0 голосов
/ 25 мая 2020

Всем привет, так что это задание CS50, оно предполагает восстановление кучи фотографий с карты памяти с помощью функций обработки файлов C. Он восстанавливает первую фотографию (то есть 000.jpeg), но когда дело доходит до перехода к новому jpeg, он может записать только один блок (512 Байт) один раз, а затем останавливается. Я ищу условие для его автоматизации (ссылаясь на приведенное выше printf ("Я могу писать в новый jpeg \ n");) с while l oop, но функция isjpeg () не работает, так как она то же начало (не уверен, почему, но попробовал, не работает). Я ищу для этого способ продолжения. Спасибо всем, кто был оценен по достоинству.

(Это результат вывода на терминал, чтобы вы могли видеть результат; количество сообщений, которые я не смог найти, уменьшено для упрощения демонстрации.)

$ ./recover card.raw
I could not found a new so keep goin
I could not found a new so keep goin
I can found the first jpeg
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I can write to the new jpeg

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef unsigned char BYTE;
int main(int argc, char *argv[])
{
    int jpegnumber; jpegnumber = 0;
    bool isjpeg();
    bool jpeghasfound = false;
    char filename[8];

    if (argc != 2 )
    {
        printf("Program should have one command line argument \n");
        return 1;
    }

    FILE *file = fopen(argv[1], "r");

    if (file == NULL)
        return 1;

    BYTE buffer[512];

    FILE* img;

    while (fread(buffer, 512, 1, file)) // if it reads something
    {
        if ( isjpeg(buffer) && (!jpeghasfound) ) // it founds a jpeg first time
        {
            jpeghasfound = true;

            sprintf(filename,"%03i.jpg",jpegnumber);

            img = fopen(filename,"w");
            printf("I can found the first jpeg\n\n");
            if (img == NULL)//nullcheck
            {
                printf("There is nothing to open \n");
                return 1;
            }
            fwrite(buffer,512,1,img);

            jpegnumber++; // increment the count
        }

        else if (isjpeg(buffer) && jpeghasfound)  // Founding a new jpeg
            {
                fclose(file); // close old file
                sprintf(filename,"%03i.jpg",jpegnumber);
                if (img == NULL)//nullcheck
                {
                    printf("There is nothing to open \n");
                    return 1;
                }
                    fwrite(buffer,512,1,img);
                    printf("I can write to the new jpeg\n");
            }
        else  // if we have not find a new jpeg we should keep writing to old file
        {
            fwrite(buffer,512,1,img);
            printf("I could not found a new so keep goin\n");
        }

    }
    fclose(file);
    fclose(img);
}

bool isjpeg(BYTE buffer[])
{

        if((buffer[0] == 0xff ) && (buffer[1] == 0xd8 ) && (buffer[2] == 0xff ) && ((buffer[3] & 0xf0 ) == 0xe0))
        {
            return true;
        }
        else
        {
            return false;
        }
}
...