Я пытаюсь остановить программу извлечения фотографий, когда она обнаруживает, что находится в конце файла, который нужно извлечь. Я сделал это, поставив условие if:
if (feof(file))
{
return 2;
}
После функции fread:
fread(array, 1, 512, file);
Таким образом, если fread читает до конца файла, запускается feof и, таким образом, завершается программа. Это мой код:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("Invalid entry.\n");
return 0;
}
int counter = 1;
FILE* images;
char jpg_name[8];
// Check if bytes are jpg. signatures.
for (int n = 0; counter < 51; n = n + 512)
{
// Open file for reading.
FILE *file = fopen(argv[1], "r");
if (!file)
{
return 1;
}
unsigned char array[512];
fseek(file, n, SEEK_SET);
fread(array, 1, 512, file); // if EOF, won't have 512 to write into!!!
if (feof(file))
{
return 2;
}
fclose(file);
if (array[0] == 0xff && array[1] == 0xd8 && array[2] == 0xff && (array[3] & 0xf0) == 0xe0)
{
// Convert integer to string and store into jpg character array. Increment image number.
sprintf(jpg_name, "%03i.jpg", counter);
counter++;
// Open images file to write into, allocate memory to jpg file to write into, write 512 bytes from array into image file.
images = fopen(jpg_name, "a");
fwrite(array, 1, 512, images);
fclose(images);
}
else // If 1st 4 bytes aren't jpg signature.
{
if (counter > 1)
{
images = fopen(jpg_name, "a");
fwrite(array, 1, 512, images);
fclose(images);
}
}
}
}
Я также попытался поставить условие:
if (fread(array, 1, 512, file) == 512)
В программу, чтобы она перестала работать после того, как прочитает менее 512 байт, чтобы остановить автоматическую остановку программы, но это тоже, похоже, не работает.
Будем очень признательны за любые разъяснения или советы, спасибо!
argv[1]
и как он соотносится с другими обрабатываемымиjpg_name
файлами? - person kaylum   schedule 14.07.2020feof
. После того, как операция чтения указывает, что данные были использованы, вы используетеfeof
, чтобы определить, обнаружила ли операция чтения ошибку или прочитала все данные. - person William Pursell   schedule 14.07.2020fread
вернет общее количество прочитанных. Массив после этого останется без изменений. - person William Pursell   schedule 14.07.2020fread(array, 1, 512, file); // if EOF, won't have 512 to write into!!! if (feof(file))
Вызовfeof()
только в том случае, если возвращаемое значение изfread()
== 0; в противном случае, если только что был прочитан последний входной файл, тогдаfeof()
вернет «истину», НО последние считанные данные не будут обработаны. - person user3629249   schedule 15.07.2020