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

cs50 pset5为什么我的图像恢复程序只恢复50幅图像中的49幅?,c,image,jpeg,recovery,cs50,C,Image,Jpeg,Recovery,Cs50,因此,我的recover.c程序运行良好,只是它无法从文件中恢复所有50个图像 我只能恢复50张图像中的49张。我很确定丢失的图像是第一张图像(一个在雪地背景中的女孩),因为我在编写和测试过程中很早就看到了这张图像,但最终的程序似乎不再恢复这张图像了 有人帮忙吗 /** * recover.c * * Computer Science 50 * Problem Set 4 * * Recovers JPEGs from a forensic image. */ #includ

因此,我的recover.c程序运行良好,只是它无法从文件中恢复所有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
}
/**
*恢复
*
*计算机科学50
*习题集4
*
*从法医图像恢复JPEG。
*/
#包括
#包括
#包括
typedef uint8_t字节;
类型定义uint32_t DWORD;
typedef int32t长;
typedef uint16_t字;
类型定义结构
{
字节rgbtBlue;
字节rgbtGreen;
字节rgbtRed;
}_uuu属性_uuu((uuu压缩_uuu))
RGBTRIPLE;
内部主(空)
{
//打开卡片文件
char*infle=“card.raw”;
文件*card=fopen(填入“r”);
如果(卡==NULL)
{
printf(“无法打开%s。\n”、“card.raw”);
返回2;
}
int f=0,c=0,imageno=0;
//c表示正在编写jpg
文件*图像;
字符标题[25];
字节缓冲区[512];
/*重复此操作,直到卡结束*/
做
{
//将一个块读入缓冲区
fread(缓冲区,512,1,卡);
如果(缓冲区[0]==0xff&&buffer[1]==0xd8&&buffer[2]==0xff)
{
如果(图像编号<10)
{
sprintf(标题,“00%d.jpg”,imageno);//更改jpg标题
}
其他的
{
sprintf(标题,“0%d.jpg”,imageno);//更改jpg标题
}
如果(f==1)//关闭上一个jpg
{
fclose(图像);
imageno++;
}
图像=fopen(标题“w”);
f=1;//第一个jpg已经打开
c=1;//jpg打开
}
//jpg已经开门了?
如果(c==1)fwrite(缓冲区,512,1,图像);
}    
而(!feof(card));
返回0;
//关闭所有剩余的文件
}

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


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

考虑使用一个
sprintf(标题为“%03d.jpg”,imageno)
,而不是现在使用的两个
sprintf()
调用。@JohnBollinger谢谢!检查函数调用的返回值——例如,
fread()
——是否有错误代码或意外结果。
}而(!feof(card))是坏的。这意味着您已经处理了非法读取。由于缺少它,可以注意到对
fread
返回值的任何检查(或使用)。关于从卡中恢复图像的问题很多。请将
do…while()
循环更改为
while(fread(…){…}
循环。不要通过函数控制任何循环:
feof()
先生,您是真正的英雄。