Всем привет, так что это задание CS50, оно предполагает восстановление кучи фотографий с карты памяти с помощью функций обработки файлов C. Он восстанавливает первую фотографию (то есть 000.jpeg), но когда дело доходит до перехода к новому jpeg, он может записать только один блок (512 Байт) один раз, а затем останавливается. Я ищу условие для его автоматизации (ссылаясь на приведенное выше printf ("Я могу писать в новый jpeg \ n");) с while l oop, но функция isjpeg () не работает, так как она то же начало (не уверен, почему, но попробовал, не работает). Я ищу для этого способ продолжения. Спасибо всем, кто был оценен по достоинству.
(Это результат вывода на терминал, чтобы вы могли видеть результат; количество сообщений, которые я не смог найти, уменьшено для упрощения демонстрации.)
$ ./recover card.raw
I could not found a new so keep goin
I could not found a new so keep goin
I can found the first jpeg
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I could not found a new so keep goin
I can write to the new jpeg
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef unsigned char BYTE;
int main(int argc, char *argv[])
{
int jpegnumber; jpegnumber = 0;
bool isjpeg();
bool jpeghasfound = false;
char filename[8];
if (argc != 2 )
{
printf("Program should have one command line argument \n");
return 1;
}
FILE *file = fopen(argv[1], "r");
if (file == NULL)
return 1;
BYTE buffer[512];
FILE* img;
while (fread(buffer, 512, 1, file)) // if it reads something
{
if ( isjpeg(buffer) && (!jpeghasfound) ) // it founds a jpeg first time
{
jpeghasfound = true;
sprintf(filename,"%03i.jpg",jpegnumber);
img = fopen(filename,"w");
printf("I can found the first jpeg\n\n");
if (img == NULL)//nullcheck
{
printf("There is nothing to open \n");
return 1;
}
fwrite(buffer,512,1,img);
jpegnumber++; // increment the count
}
else if (isjpeg(buffer) && jpeghasfound) // Founding a new jpeg
{
fclose(file); // close old file
sprintf(filename,"%03i.jpg",jpegnumber);
if (img == NULL)//nullcheck
{
printf("There is nothing to open \n");
return 1;
}
fwrite(buffer,512,1,img);
printf("I can write to the new jpeg\n");
}
else // if we have not find a new jpeg we should keep writing to old file
{
fwrite(buffer,512,1,img);
printf("I could not found a new so keep goin\n");
}
}
fclose(file);
fclose(img);
}
bool isjpeg(BYTE buffer[])
{
if((buffer[0] == 0xff ) && (buffer[1] == 0xd8 ) && (buffer[2] == 0xff ) && ((buffer[3] & 0xf0 ) == 0xe0))
{
return true;
}
else
{
return false;
}
}