2017-09-24 125 views
0

问题是从.raw文件中恢复一些JPG文件。我恢复的IMG在恢复CS50中与原始版本不匹配

当我运行check50我得到“恢复IMG不匹配”。

:) recover.c存在。
:) recover.c编译。
:)处理缺乏法医图像的
:(复苏000.jpg正确– 恢复的形象不符
:(恢复图像居中正确– 恢复的形象不符
:(复苏015.jpg正确– 015.jpg找不到

我真的很努力地找出问题所在,每次我找不到问题出在哪里,我希望有人可以和gi给我一个和平的建议。

#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

在[cs50.se]的堆栈交换网络上有一个指定的站点。 – StoryTeller

回答

1

中,你做事的顺序是非常混乱,并导致错误。例如:

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

你应该重新组织你的代码,以便它以一种自然的方式一个接一个地执行。该计划可能是这样的:

  • 检查命令行参数
  • 打开RAW文件
  • 主回路:
    • 读固定大小的块。如果它不能被读取,退出循环
    • 检查第一字节识别JPG如果是这样:
      • 写街区,靠近JPG文件创建文件名
      • 打开JPG文件
      • 递增块计数器
  • 关闭原始文件

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

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