私はCを学ぶためにハーバード大学からEDx CS50クラスを受け取りました。私は問題セットの1つに私のコードが変わったことに気付きました。元のものがなぜそうでないのか理解したい)。この割り当ての考え方は、JPEGファイルへの参照が削除されたファイルをチェックして、メモリから写真を復元することです。fopenはCの変数値を変更します
私が持っている問題は、以下のfoundJPEG
ブール値です。私の最初のアイデアは、最初の写真が見つかるまでそれをfalseに設定し、それから個々のファイルを書き始める(連続したメモリブロックになるはずだった)。 jpegヘッダーが初めて検出されると、新しい書き込みファイルが生成され、新しいjpegが見つかるまでその情報がコピーされます。さらに、foundJPEG
変数はtrue
になります。もともと私はif(foundJPEG)
コードブロックのelse節の下でこの宣言をしていましたが、実行した後にfopen
関数が呼び出されるたびに変数はfalse
に戻りました。したがって、変数がすでにtrueに変更されている場合でも、新しいファイルを開いた後で、新しいfoundJPEG = true;
ステートメントを追加しました。
fopen
が呼び出されるたびにブール値がfalseになっている理由を知りたいと思います。特に、Cはメモリの割り当てを非常に制御しているので、ファイルを開くたびに、あるいは範囲の問題のために何らかの形で上書きされていたかどうかは疑問でした。おそらくこれはルーキーミスだと思いますが、誰かがこれを理解しやすくするために、より大きなアプリケーションを書くときにミスを混乱させないように考えていたかもしれません。どうもありがとうございました!
/*
* recover.c
*
* Computer Science 50
* Problem Set 4
*
* Recovers JPEGs from a forensic image.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
typedef uint8_t BYTE;
int main(int argc, char* argv[]) {
int k = 0;
bool foundJPEG = false;
char title[7];
FILE* file = fopen("card.raw", "rb");
FILE* img;
BYTE buf[512];
int size = sizeof(buf);
while(fread(&buf, size, 1, file) == 1) {
if(buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff && buf[3] >= 0xe0 && buf[3] <= 0xef) {
if(foundJPEG) {
fclose(img);
k++;
sprintf(title, "%03d.jpg", k);
img = fopen(title, "wb");
foundJPEG = true;
}
else {
sprintf(title, "%03d.jpg", k);
img = fopen(title, "wb");
foundJPEG = true;
}
}
if(foundJPEG) {
fwrite(&buf, size, 1, img);
}
}
fclose(img);
return 0;
}
問題を1つまたは2つに圧縮できますか?小説を読むことは楽しいことではありません。 –
imgが一度も定義されていないときは、最初にfclose(img)を呼び出すときに、未定義の動作があると思います。さらに、ifおよびelse foundJPEGテストで厳密に同一のコードブロックがあります。 –
@self申し訳ありませんが、ここで初めて質問を書いています。基本的に、私はそのコードブロックでfopen関数がfoundJPEGブール値の値を変更する理由を知りたいと思います。 – Sraffa