cs50 pset5 为什么我的图像恢复程序只能恢复 50 张图像中的 49 张?

cs50 pset5 why does my image recovery program only recover 49 of 50 images?

所以我的 recover.c 程序运行良好,除了无法从 card.raw 文件中恢复全部 50 张图像。

我只能让它恢复 50 张图像中的 49 张。我很确定丢失的图像是第一张图像(雪地背景中的女孩),因为我在编写和测试过程的早期看到了该图像,但最终程序似乎不再恢复该图像。

有什么帮助吗?

  /**
 * recover.c
 *
 * Computer Science 50
 * Problem Set 4
 *
 * Recovers JPEGs from a forensic image.
 */

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

typedef uint8_t  BYTE;
typedef uint32_t DWORD;
typedef int32_t  LONG;
typedef uint16_t WORD;

typedef struct
{
    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
} __attribute__((__packed__))
RGBTRIPLE;



int main(void)
{
    // OPEN CARD FILE
    char* infile = "card.raw";

    FILE* card = fopen(infile, "r");
    if (card == NULL)
    {
        printf("Could not open %s.\n", "card.raw");
        return 2;
    }

    int f = 0, c = 0, imageno = 0;
    // c signals that a jpg is being written
    FILE* images;
    char title[25];
    BYTE buffer[512];

    /*repeat until end of card*/
    do
    {
        //read one block into buffer

        fread(buffer, 512, 1, card);

        if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)
        {
            if (imageno < 10)
            {
                sprintf(title, "00%d.jpg", imageno); //change jpg title
            }
            else
            {
                sprintf(title, "0%d.jpg", imageno); //change jpg title
            }

            if (f == 1) //close previous jpg
            {
                fclose(images);
                imageno++;
            }

            images = fopen(title, "w");
            f = 1; //very first jpg has been opened
            c = 1; //jpg open
        }
        //jpg already open?
        if (c == 1) fwrite(buffer, 512, 1, images);
    }    
    while (!feof(card));
    return 0;
        //close any remaining files
}

您根据变量 imageno 的值创建了一个文件名。您稍后会增加该变量,但前提是您的程序先前打开了另一个文件。特别是,您在打开第一个文件后不会增加它,因此为第二个文件计算的名称与为第一个文件计算的名称相同,并且提取的第一个文件将被覆盖。

您应该在每次创建新文件名或每次打开文件时无条件递增 imageno