2016-07-04 37 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関数は3回の反復のたびにファイルを正常に読み取ります。しかし、3回目の反復では、freadはセグメンテーション違反を引き起こします。なぜそれが起こるかもしれない?セグメンテーションフォールトを引き起こす "fread"関数

+2

これがC++であると思われる場合は、なぜC++のものを使用しないのですか?それがcであると思われる場合は、C++タグ – user463035818

+2

を削除してください。デバッガを使用してコードをステップ実行する方法を学ぶのは正しいです。 –

答えて

1

sprintf(タイトル、 "%。3d.jpg"、i);文字列値XXX.jpgをタイトルバッファに入れます。これは7バイト長です。

しかし、sprintf nullは文字列を終了させるため、nullバイトを格納するためには追加購入が必要です。

+0

うん。あなたが正しい 。私は気付かなかったかもしれない。ありがとう :) –

関連する問題