2015-02-28 5 views
0

Я использовал отладчик для этого кода, и в моем коде есть пятно, где int неожиданно изменяется. Я объявляю int jpg = 0 около вершины. Около 10 строк ниже, что я увеличиваю jpg на 1. Отладчик говорит jpg = 1 в этот момент. Это делается на следующей строке, если jpg < 10. Затем происходит что-то странное. После выполнения функции sprintf jpg теперь равно 0. Зачем? !! Это затмевает остальную часть моего кода. Я не могу понять, почему он меняет jpg обратно на 0 прямо здесь.int возвращается в исходное состояние неожиданно

Спасибо за вашу помощь, Тодд


FILE *outptr; 

int main(void) 
{ 
    // open input file 
    FILE* image = fopen("card.raw", "r"); 
    if (image == NULL) 
    { 
     printf("Could not open, does %s exist?\n", "card.raw"); 
     return 1; 
    } 

    // declare a pointer to buffer 
    BYTE buffer[512]; 

    // count the number of JPG files and create JPG filename 
    int jpg = 0; 
    char filename[7]; 

    // read 512 bytes of the card 
    while (fread(&buffer, 1, 512, image) == 512) 
    { 
     // check first 4 bytes for JPG header info 
     if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] == 0xe0 || buffer[3] == 0xe1)) 
     { 
      // increment jpg number and jpg filename 
      jpg = jpg + 1; 

      if (jpg < 10) 
      { 
       sprintf(filename, "00%d.jpg", jpg); 
      } 
      else 
      { 
       sprintf(filename, "0%d.jpg", jpg); 
      } 

      // check if this is first JPG, close previous jpg file if not 

      if (jpg != 1) 
      { 
       fclose(outptr); 
      } 

      // open output file 
      FILE* outptr = fopen(filename, "w"); 
      if (outptr == NULL) 
      { 
       fclose(image); 
       fprintf(stderr, "Could not create %s.\n", filename); 
       return 2; 
      } 

      // write the 512B of buffer info to JPG file 
      fwrite(&buffer, 1, 512, outptr); 
     } 

     // not the start of a new jpg file, have we reached a jpg yet? 
     else if (jpg != 0) 
     { 
      // write the 512B of buffer info to JPG file 
      fwrite(&buffer, 1, 512, outptr); 
     }  
    } 

    // close the files 
    fclose(image); 
    fclose(outptr); 
} 
+1

Вы действительно хотите открыть «сырой» файл в текстовом режиме *? –

+0

«outptr» затеняет глобальную декларацию. Я не уверен, вызвало ли это проблему (скорее всего, маловероятно, IMO), но это похоже на UB (как мне кажется, 'fclose' нуждается в ненулевом указателе). – mafso

+0

'filename' недостаточно велик, чтобы удерживать вывод' sprintf'. У вас есть 7-символьная строка плюс NUL. Это переполнение и перезапись 'jpg' – kdopen

ответ

1

У вас есть переполнение буфера . В массиве filename отсутствует пространство для ограничителя строк, поэтому вы пишете восемь символов символов в семисимвольный массив. Это приводит к undefined behavior.

+0

Спасибо, ребята! Имя файла было недостаточно большим, и этот вопрос был исправлен. У меня все еще была проблема, когда я пишу во второй раз. Это произошло потому, что я снова объявил FILE * outptr в коде и перезаписал глобальную переменную. Я удалил FILE * из более поздней декларации, и все отлично поработало! Еще раз спасибо!! –

Смежные вопросы