【解決方法】実行後に JPEG ファイルが表示されないのはなぜですか?


CS50 Recover の問題を実行しています。./recover card.raw を実行した後、プログラムは実行されますが、画像が表示されません。

私が試したこと:

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    if(strcmp(argv[1], "card.raw")!=0){
        printf("Usage: ./recover card.raw\n");
        return 1;
    }

    FILE *input=fopen(argv[1], "r");
    if (input==NULL){
        printf("Could not open input file: %s\n", argv[1]);
        return 1;
    }

    unsigned int buffer[512];
    char filename[8];
    int counter=0;

    FILE *file=NULL;




    while(fread(buffer, 1, sizeof(buffer), input)){

     //if it's the start of a JPEG file
      if(buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && (buffer[3] & 0xf0)==0xe0){

        if(counter==0){             //if first JPEG

            sprintf(filename, "%03i.jpg", counter);
            filename[7]='\0';
            file=fopen(filename, "a");

            fwrite(buffer, 1, sizeof(buffer), file);
            counter++;

        }else{                  //else if not first JPEG
            fclose(file);

            sprintf(filename, "%03i.jpg", counter);
            filename[7]='\0';
            file=fopen(filename, "a");

            fwrite(buffer, 1, sizeof(buffer), file);
            counter++;
        }
    }
    else{
        if(file!=NULL){
            fwrite(buffer, 1, sizeof(buffer), file);
            }
        }

    }

    if (file != NULL) { // close the file only if it was opened successfully
    fclose(file);
    }

    fclose(input);
}

解決策 1

コンパイルしても、コードが正しいとは限りません! :笑う:
開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。

それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:

int Double(int value)
   {
   return value * value;
   }

何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!

解決策 2

ダミー データを使用してコードを実行したところ、問題なく動作しました。 したがって、実行時に何が起こるかを正確に確認するには、yur デバッガーを使用する必要があります。 次の行から始まるコードの部分に問題がある可能性があります。

C++
if(buffer[0]==0xff && buffer[1]==0xd8 && buffer[2]==0xff && (buffer[3] & 0xf0)==0xe0){

コメント

タイトルとURLをコピーしました