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

时间:2016-09-29 17:25:19

标签: c image jpeg recovery cs50

所以我的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
}

1 个答案:

答案 0 :(得分:1)

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

每次创建新文件名时,或每次打开文件时,都应无条件地增加imageno