I tried to implement recover through the simplest and shortest way I could imagine.

The code compiles and saves 50 JPGs with proper names, but when I open them, all of them are just empty and even ```ls -l``` shows that the files have **0B**.

Also I tried debugging using ```printf``` and I found that each file is ***missing 1 block***.
I checked online and found that each file should have either 19 or 20 blocks, but my files have 18 or 19 blocks.

I couldn't figure out why the files are empty or why I have been missing 1 block.

Here's the code:

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

    #define block_size 512
    typedef uint8_t BYTE;

    int main(int argc, char *argv[])
    {
        if (argc != 2)
        {
            printf("Usage: ./recover card\n");
            return 1;
        }
        FILE *card = fopen(argv[1], "r");
        if (card == NULL)
        {
            printf("%s: could not open\n", argv[1]);
            return 2;
        }

        FILE *jpg = NULL;
        BYTE buffer[block_size];
        int jpg_count = 0;

        // 7 characters for name + 1 character for null
        char jpg_name[8] = {0};

        // To check no. of blocks for each jpg
        int write_count = 0;

        // Iterate through the card
        while (fread(&buffer, 1, block_size, card) == block_size)
        {
            // Check for start of jpg
            if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff
            && (buffer[3] & 0xf0)== 0xe0)
            {
                // If found start close previous jpg if availabe
                if (jpg != NULL)
                {
                    fclose(jpg);
                    printf("\n");
                }
                // Reset w_count for new jpg
                write_count = 0;

                // Create new jpg
                sprintf(jpg_name, "%03i.jpg",jpg_count++);
                // Print jpg name for testing
                printf("%s: ", jpg_name);

                jpg = fopen(jpg_name, "w");
                if (jpg == NULL)
                {
                    printf("error\n");
                    fclose(jpg);
                }
            }
            // The first if and this if are not mutually exclusive
            // if jpg exists keep writing until EOF or next JPEG found(above condition)
            if (jpg_count > 0 && jpg != NULL)
            {
                fwrite(&buffer, 1, block_size, card);
                printf("%i ", write_count++);
            }
        }
        printf("\n");
        // Close last jpg
        fclose(jpg);
        fclose(card);
        return 0;
    }