2016-07-04 102 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(title,「%。3d.jpg」,i);會將一個字符串值XXX.jpg放到標題緩衝區中,該緩衝區長度爲7個字節。

但是sprintf null終止字符串,所以需要額外的buyte來存儲空字節。

+0

是的。你是對的 。我本不可能注意到。謝啦 :) –