2017-01-04 6 views
0

私は非常に初心者のプログラマーであり、優れたcs50コースの問題に取り組んでいる間に、その性質を理解できない問題に遭遇しました。私は、メモリカードの画像からJPEG画像を回復するためのプログラムを実施していると、以下のようにファイルの最後にブレークを実装しています:ファイルの終わり

if(file > 1) 
    { 
     if (fread(&buffer, 1, 512, in_pointer) != 512) 
     { 
      free(filename); 
      return 0; 
     } 
     else 
      fseek(in_pointer, -512, SEEK_CUR); 
    } 

(写真は512個のバイトのブロックでカードを埋めています)。私が最初にこれを実装したとき、それは私の最初の絵を壊しました(それは認識可能でしたが歪んでいました)ので、最初のif文でそれを除外しました。今ではセットの中間ファイルは少しオフです - 彼らはまだJpegsとして開きますが、私は彼らのサムネイルを動作させることができません。私の仮説は、私がJPEGファイルフォーマットヘッダを壊しているということです。最初(セットの最初と最後のイメージを完全に含む)。 私の質問は以下のとおりです。

  1. 私月桃ソリューションは、トラブルの原因となっているので、EOFブレークを実装するためのエレガントな方法は何ですか?

  2. 私が作成した問題の可能性は何ですか?

は、ここでPSは全部

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

int main(int argc, char *argv[]) 
{ 
// ensure proper usage 
if (argc != 2) 
{ 
    fprintf(stderr, "enter exactly two command line arguments: ./recover and destination of disc to scan\n"); 
    return 1; 
} 

//name the file 
char *infile = argv[1]; 

//open card file and ensure proper format 
FILE *in_pointer = fopen(infile, "r"); 
if (in_pointer == NULL) 
{ 
    fprintf(stderr, "could not open %s\n", infile); 
    return 2; 
} 

typedef uint8_t BYTE; 

BYTE buffer[512]; 
bool new_jpeg = false; 
int block = 0; 
int file = 0; 
char *filename = malloc(3); 
//sprintf(filename, "%03i.jpg",1); 

do 
{ 

    //read a 512 block of a jpeg 
    fread(&buffer, 512, 1, in_pointer); 

    //check for new jpeg 
    if (buffer[0] == 0xff && 
     buffer[1] == 0xd8 && 
     buffer[2] == 0xff && 
     (buffer[3] & 0xf0) == 0xe0) // took me a while to figure this out 
     { 
    new_jpeg = true; 
    //printf("jpeg found, block %i\n", block); 
     } 

    block++; 



} while(new_jpeg == false); 

do 
{ 
      //set name of file to write to 
      sprintf(filename, "%03i.jpg",file); 
      file++; 
      new_jpeg = false; 

      // open output file 
      FILE *img = fopen(filename, "w"); 
      if (img == NULL) 
       { 
        fprintf(stderr, "Could not create %s.\n", filename); 
        return 3; 
       } 


     //add blocks to file while before we reach the nea JPEG. 
     do 
     { 


       fwrite(&buffer, 1, 512, img); 

       //read the next block 
       fread(&buffer, 1, 512, in_pointer); 

       //There MUST be a better way... Anyhow this checks for end of file but backtracks becouse the act of checking moved the file coursor forward... 
       if(file > 1) 
       { 
        if (fread(&buffer, 1, 512, in_pointer) != 512) 
        { 
         free(filename); 
         return 0; 
        } 
        else 
        fseek(in_pointer, -512, SEEK_CUR); 
       } 


       block++; //we are reading off teh next block 

       if (buffer[0] == 0xff && 
        buffer[1] == 0xd8 && 
        buffer[2] == 0xff && 
        (buffer[3] & 0xf0) == 0xe0) // took me a while to figure this out 
       { 
        new_jpeg = true; 
        //printf("jpeg %i found, block %i\n", file, block); 
       } 


     }while(new_jpeg == false); 

}while(!feof(in_pointer));  

free(filename); 
//ran valgrind no probs detected. 
} 
+0

ファイルを開くためにどのモードが使用されましたか?バイナリファイルを示すために 'rb'を指定しましたか? – levengli

+0

いいえ...私は複数のファイルに書き込んでいるので "w"を使用しました... 編集:rbモードで最初のファイルを開くようにしましたが、それは役に立たなかった – Tikhon

+0

もっとコードを追加してください。スニペットから正確に何が問題になるのかは明らかではありません – levengli

答えて

0

OKで、非常に多くの

Tikhon

をありがとう、私はそれを修正しました。

代わりにEOFをチェックするために、コードの全体別のセクションを有していると私は1つの石で2羽が死亡したとEOFのために確認しながらファイルをFREAD:

   //read the next block 
       int k = fread(&buffer, 1, 512, in_pointer); 
       if(k != 512) 
       { 
         free(filename); 
         return 0; 
       } 

私はまだ「私の以前の方法はdidnの理由はわかりません私は極端に提案に感謝しています...

+0

お返事ありがとうございます。最初にEOFチェッカーを実装したとき、私は000.jpg(50枚の画像の最初)を破って、if関数がgettoの回避策を試していたのです。それを実装して、000.jpgはOKでしたが、今は001.jpgを破っただけでなく、一部の(しかしすべてではありません)次の写真とねじ込む... – Tikhon

関連する問題