我正在做 CS50 课程的Recover作业。
收到错误:恢复的图像不匹配(来自 CS50 错误检查器)。换句话说,我成功恢复了 50/50 JPG,但它们都是空白的
似乎无法弄清楚问题出在哪里。
尝试重构一下代码,但老实说我很茫然。我知道它一定与处理多块文件有关,但也许我错过了一些更基本的东西。 CS50 是我第一次涉足 C,因此我希望尽可能详细地阐述。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 2) {
printf("Please add exactly one command line argument!");
return 1;
}
FILE *card = fopen(argv[1], "r");
char *filename = malloc(8);
FILE *img = NULL;
int numOfImgs = 0;
if (card == NULL)
{
printf("Could not access memory card.\n");
return 1;
}
uint8_t buffer[512];
while (fread(buffer, 1, 512, card) == 512)
{
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0) {
if (img == NULL) {
sprintf(filename, "%03i.jpg", numOfImgs);
img = fopen(filename, "w");
fwrite(buffer, 1, 512, img);
}
else {
fclose(img);
sprintf(filename, "%03i.jpg", numOfImgs);
img = fopen(filename, "w");
fwrite(buffer, 1, 512, img);
}
numOfImgs++;
}
}
fclose(img);
fclose(card);
free(filename);
return 0;
}
作业陈述如下:
当然要认识到,JPEG 可以跨越连续的块。否则,任何 JPEG 都不能大于 512 B。
您似乎错误地认为 JPEG 文件永远不会包含超过一个 512 字节的块。
您仅将每个恢复文件的前 512 字节块写入输出 JPEG 文件。您正在丢弃所有后续块,这是错误的。