cs50 pset5为什么我的图像恢复程序只恢复50幅图像中的49幅?
因此,我的recover.c程序运行良好,只是它无法从文件中恢复所有50个图像 我只能恢复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
*
* 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()
先生,您是真正的英雄。