2016-09-29 3 views
-1

私のrecover.cプログラムは、card.rawファイルからすべての50イメージを回復することができないという事実を除いてうまくいきます。cs50 pset5私の画像回復プログラムは、50枚の画像のうち49枚しか回復しないのはなぜですか?

私は50枚の画像のうち49枚を回復することしかできません。私はかなりの最初のイメージ(雪の背景にある女の子)ですが、私は書き込みとテストの過程でそのイメージを早期に見ていたが、最終的なプログラムはそれ以上イメージを回復しないように見えるので、

ヘルプはありますか?

/** 
* 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 
} 
+0

今使っている2つの 'sprintf()'呼び出しの代わりに、 'sprintf(title、"%03d.jpg "、imageno)'を考えてみましょう。 –

+0

@JohnBollingerはそれをありがとう! –

+0

関数呼び出し--e.gの戻り値を確認してください。 'fread()' - エラーコードや予期しない結果が発生しました。 –

答えて

1

変数imagenoの値に基づいてファイル名を作成します。あとでその変数をインクリメントしますが、プログラムが以前に別のファイルを開いた場合にのみ、その変数をインクリメントします。特に、最初のファイルを開いた後にファイルを増やさないため、最初のファイルに対して計算されたのと同じ名前が2番目のファイルに対して計算され、抽出された最初のファイルが上書きされます。

新しいファイル名を作成するたびに、またはファイルを開くたびに、無条件でimagenoを増やす必要があります。

+0

あなたは、真の英雄です。 –

関連する問題