2016-07-04 4 views
-5
int main(int argc, char* argv[]) 
{ 
// opens the memory 
FILE* inptr = fopen("card.raw", "r"); 
if(inptr == NULL) 
{ 
    // checks for the availability of the file 
    printf("Couldn't open card.raw\n"); 
    return 1; 
} 
char title[7]; 
int i = 0; 
bool start = false; 
BYTE* block = malloc(sizeof(BYTE) * 512); 
while(fread(block, sizeof(BYTE), 512, inptr) == 512) 
{ 
    if(fsign(block) && !start) 
    { 
     sprintf(title,"%.3d.jpg" , i); 
     i++; 
     FILE* image = fopen(title, "w"); 
     fwrite(block, sizeof(BYTE), 512, image); 
     fclose(image); 
    } 
    else if(!fsign(block) && start) 
    { 
     FILE* image = fopen(title, "a"); 
     fwrite(block, sizeof(BYTE), 512, image); 
     fclose(image); 
    } 

} 
fclose(inptr); 
free(block); 
} 

bool fsign(BYTE* block) 
{ 
    if(*(block) == 0xff) 
    { 
     if(*(block + 1) == 0xd8) 
     { 
      if(*(block + 2) == 0xff) 
      { 
       if(*(block + 3) >= 0xe0 && *(block + 3) <= 0xef) 
       { 
        return true; 
       } 
      } 

     } 

    } 

return false; 

내 질문은 while 루프에 있습니다. while 루프는 3 번 반복되고 fread 함수는 세 번 반복 될 때마다 파일을 성공적으로 읽습니다. 그러나 세 번째 반복에서는 fread가 세그멘테이션 오류를 발생시킵니다. 왜 그런 일이 일어날까요?세분화 오류를 일으키는 "fread"함수

+2

이것이 C++라고 생각된다면 왜 C++을 사용하지 않습니까? 그것이 c로되어 있다면, C++ 태그 – user463035818

+2

을 제거하십시오. 디버거를 사용하여 코드를 단계별로 실행하는 법을 배우기에 적합한 시점입니다. –

답변

1

sprintf (제목, "%. 3d.jpg", i); 타이틀 버퍼에 문자열 값 XXX.jpg를 넣습니다. 길이는 7 바이트입니다.

그러나 sprintf null은 문자열을 종료하므로 null 바이트를 저장하려면 추가 구매가 필요합니다.

+0

예. 네가 옳아 . 나는 결코 눈치 채지 못했습니다. 고마워요 :) –

관련 문제