Я использовал отладчик для этого кода, и в моем коде есть пятно, где 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);
}
Вы действительно хотите открыть «сырой» файл в текстовом режиме *? –
«outptr» затеняет глобальную декларацию. Я не уверен, вызвало ли это проблему (скорее всего, маловероятно, IMO), но это похоже на UB (как мне кажется, 'fclose' нуждается в ненулевом указателе). – mafso
'filename' недостаточно велик, чтобы удерживать вывод' sprintf'. У вас есть 7-символьная строка плюс NUL. Это переполнение и перезапись 'jpg' – kdopen