Неожиданное возвращаемое значение от fread()

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

int main()
{
    FILE* bmp = NULL;
    uint32_t offset;
    uint8_t* temp = NULL;
    size_t read;
    unsigned int x_dim = 600, y_dim = 388;

    bmp = fopen("test_colour.bmp", "r");

    if (!bmp)
        return -1;

    /* Get the image data offset */
    fseek(bmp, 10, SEEK_SET);
    fgets((char*)&offset, 4, bmp);

    printf("Offset = %u\n", offset);

    temp = malloc(3*x_dim*y_dim*sizeof(uint8_t));

    if (!temp)
        return -1;

    /* Go the the position where the image data is stored */
    fseek(bmp, offset, SEEK_SET);

    /* Copy image data to array */
    printf("%u bytes requested!\n", 3*x_dim*y_dim);
    read = fread((void*)temp, sizeof(uint8_t), 3*x_dim*y_dim, bmp);
    printf("%Iu bytes read!\n", read);

    fclose(bmp);
    free(temp);

    return 0;
}

Я использую приведенный выше код для чтения данных RGB 24 -бит на пиксель BMP-изображения в массив. Смещение от начала файла, где данные изображения начинаются (после заголовка BMP ), указывается по смещению 10 в соответствии со спецификацией BMP. Я получаю следующий вывод при выполнении приведенного выше кода.

Offset = 54
698400 bytes requested!
33018 bytes read!

Вывод смещения кажется правильным, поскольку размер файла составляет 698454 байта (= 698400+54 ). Однако значение, возвращаемое fread(), по-видимому, указывает на то, что не все данные изображения могут быть прочитаны. Однако впоследствии я использую данные из массива tempдля преобразования данных RGB в оттенки серого и снова записываю эти данные в файл BMP. Визуальная проверка выходного изображения не указывает на какие-либо ошибки, т. е. кажется, что я действительно прочитал все входное изображение в первую очередь, хотя fread(), похоже, указывает на другое.

Может кто-нибудь объяснить такое поведение?

7
задан simon 30 July 2012 в 07:34
поделиться