2017-09-24 119 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字節長,這似乎不大可能。也許您必須從​​標題中讀取實際的圖像大小,然後複製整個圖像。