Я пытаюсь прочитать двоичный файл в следующем формате:
количество изображений [4-байтовое int]
ширина [4-байтовое int]
высота [4-байтовое число int]
данные в градациях серого [ширина * высота байтов]
(больше элементов одного типа)
Это первая вызываемая функция:
int process_file(const char *filename) {
FILE *input_file = fopen(filename, "r");
//Get number of images
unsigned int number_of_images = read_int_from_file(input_file);
//Allocate memory for all images
struct image *images = malloc(sizeof(struct image) * number_of_images);
read_images(images, number_of_images, input_file)
}
Вот структура image
для всех, кто интересуется:
struct image {
unsigned int width;
unsigned int height;
unsigned char *data;
};
И вот что делает read_int_from_file
:
static unsigned int read_int_from_file(FILE *file) {
unsigned char chars[4];
if (fread(&chars, sizeof(char), 4, file) != 4) {
fprintf(stderr, "Couldn't read enough bytes!\n");
return 0;
}
//Calculations follow that return right numbers
return out;
}
Остальное:
static int read_images(struct image *images, unsigned int number_of_images, FILE * file) {
struct image *current_image = images;
int i;
for (i = 0; i < number_of_images; i++) {
read_image(current_image++, file)
}
return EXIT_SUCCESS;
}
static int read_image(struct image *image, FILE *file) {
static long int expected_position = 4;
if (ftell(file) != expected_position) {
fprintf(stderr, "Reading @ %lu when should be @ %lu!",
ftell(file), expected_position);
exit(EXIT_FAILURE);
}
unsigned int width = read_int_from_file(file);
unsigned int height = read_int_from_file(file);
unsigned int size = width * height;
unsigned char *data = malloc(sizeof(char) * size);
if (data) {
if (fread(data, sizeof(char), size, file) != size) {
exit(EXIT_FAILURE);
}
image->width = width;
image->height = height;
image->data = data;
expected_position += 2 * 4 + width * height;
return EXIT_SUCCESS;
} else {
exit(EXIT_FAILURE);
}
}
Проблема в том, что указатель файла иногда идет вперед, когда он не должен этого делать, т.е. я нажимаю ftell(file) != expected_position
.Я получаю его после большого количества успешных чтений, но и до конца хорошего времени.
У кого-нибудь есть какая-нибудь идея, почему это может быть?Я имею в виду, даже если цифры были неправильными, это не должно произойти, не так ли?Спасибо!