C를 배우기 위해 Harvard에서 EDx CS50 클래스를 사용하고 있는데 문제 세트 중 하나에서 코드의 이상한 동작을 발견했습니다 (이미 해결 된 솔루션을 생각해 냈지만 왜 원 본이 아닌지 이해하고 싶다). 할당의 아이디어는 jpeg 파일에 대한 참조가 삭제 된 파일을 검사하여 메모리에서 사진을 복구하는 것입니다.fopen이 C에서 변수 값을 변경합니다.
내가 가진 문제는 아래의 foundJPEG
부울입니다. 나의 독창적 인 아이디어는 첫 번째 사진이 발견 될 때까지 그리고 그 이후에 개별 파일을 작성하기 전까지는 false로 설정하는 것이었다. (그들은 연속적인 메모리 블록에 있어야했다.) 처음으로 jpeg 헤더가 발견되면 새 쓰기 파일이 생성되고 새 jpeg가 발견 될 때까지 정보가 복사됩니다. 또한 foundJPEG
변수는 true
이됩니다. 원래 나는 if(foundJPEG)
코드 블록의 else 절에서만이 선언을했지만, 실행 한 후에는 fopen
함수가 호출 될 때마다 변수가 false
으로 되돌아갔습니다. 따라서 변수가 이미 true로 변경된 경우에도 새 파일을 연 다음에 새로운 foundJPEG = true;
문을 추가했습니다.
제가 알고 싶은 것은 부울이 매번 fopen
이 호출 될 때 거짓이되는 이유입니다. 특히, 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;
}
문제를 한두 문장으로 압축 할 수 있습니까? 소설 읽기는 너무 재미 있지 않습니다. –
img가 정의되지 않았을 때 fclose (img)를 처음 호출 할 때 정의되지 않은 동작이있을 수 있습니다. 게다가 if와 else foundJPEG 테스트에서 똑같은 코드 블록을 가지고 있습니다. –
@self 죄송합니다. 처음으로 질문을 올렸습니다. 기본적으로, 나는 그 코드 블록에서 fopen 함수가 foundJPEG 부울 값을 변경하는 이유를 알고 싶습니다. – Sraffa