我恢复的IMG与恢复CS50中的原始版本不匹配

时间:2017-09-24 13:46:06

标签: c cs50

问题是从.raw文件中恢复一些JPG。

当我运行check50时,我得到了#34;恢复了img不匹配"。

:) recover.c存在。
:) recover.c编译。
:)处理缺乏法医形象的问题 :(正确恢复000.jpg     恢复的图像不匹配
:(正确恢复中间图像 -     恢复的图像不匹配
:(正确恢复015.jpg     找不到015.jpg

我真的很努力地发现问题所在,每次我都无法确定问题所在,我希望有人可以给我一些建议。

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

int main(int argc, char *argv[]){

if(argc != 2){

     fprintf(stderr, "Usage: ./recover image");
    return 1;
}

//open file

FILE *inptr = fopen(argv[1], "r");
if (inptr == NULL){

    fprintf(stderr, "Could not open %s.\n", argv[1]);
    return 2;
}


int foundjpg = 0;
char filename[10];
int x=1;

//repeat until end of the card
while(x == 1){

    //buffer
    unsigned char buf[512];
    x = fread(buf, 512, 1, inptr);
    //read into buffer
    fread(buf, 512, 1, inptr);
    FILE *jpg = fopen(filename, "w");

    //start of a new jpg?
    if(buf[0]== 0xff  && buf[1] == 0xd8  && buf[2] == 0xff && (buf[3] & 0xf0) == 0xe0 ){


        if(jpg != NULL){// yes i found before

            fclose(jpg);
            sprintf(filename, "%03i.jpg" ,foundjpg );
            foundjpg++;
            jpg = fopen(filename, "w");


        }
        else{
            sprintf(filename, "%03i.jpg" ,foundjpg );
            jpg = fopen(filename , "w");
            foundjpg++;

        }
    }
    //already found a jpg?
    if(jpg != NULL && foundjpg > 0){

        fwrite(buf, 1, 512, jpg);

    }

}


fclose(inptr);

// success
return 0;

}

1 个答案:

答案 0 :(得分:1)

你做事的顺序很混乱,导致错误。例如:

    第一次使用时,
  • filename未初始化。
  • 使用它来创建文件名后增加计数器foundjpg,在程序中这意味着第二个图像被称为01.jpg。所有图像索引都关闭,最后一个丢失。
  • 如果id字节无法识别有效的jpg,则不会读取新记录,并且您的循环永远不会结束。

你应该重新组织你的代码,以便它以自然的方式做一件事。该程序可能如下所示:

  • 检查命令行参数
  • 打开原始文件
  • 主循环:
    • 读取固定大小的块。如果无法读取,请退出循环
    • 检查第一个字节是否标识jpg,如果是,
      • 创建文件名
      • 打开jpg文件进行编写
      • 写入块并关闭jpg文件
      • 增量计数器
  • 关闭原始文件

您必须决定如何处理错误。你是跳过错误的块还是中止程序?

还不清楚所有图像是否都是512字节长,这似乎不太可能。也许您必须从​​标题中读取实际图像大小,然后复制整个图像。