Итак, я пытаюсь прочитать файл .bmp на C. Позже я собираюсь зашифровать файл с помощью библиотек openssl, но это только справочная информация.
Мне нужно открыть файл в двоичном режиме (очевидно), но по какой-то причине, когда я пытаюсь открыть файл, он читает только 4 байта. Когда я пытаюсь вывести именно этот файл, который я только что открыл (для проверки на наличие ошибок), он выводит следующее: 88 24 AD FB.
При устранении неполадок я решил попробовать это на текстовом файле (54 байта) и получил точно такой же результат.
#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(){
char * fileName="pic_original.bmp";
//read the file from given filename in binary mode
printf("Start to read the .bmp file \n");
FILE *image;
image = fopen(fileName,"rb");
//print the size of the image (4 bytes every damn time)
printf("Size of image: %d\n",sizeof(image));
//output the exact file that was read (error testing)
FILE *test;
test = fopen("./test.bin", "w");
fwrite(image, sizeof(image), 1, test);
fclose(test);
fclose(image);
return 1;
}
Это изображение (загружено как png по какой-то причине)

Не совсем уверен, где я ошибаюсь, но я не очень опытен в C.
Привет, Лиам
РЕДАКТИРОВАТЬ 1:
//allocate memory for the header and image
char *headerBuf = (char *)malloc(54);
char *imageBuf = (char *)malloc(sizeof(image)-54); //this line is wrong - thanks to user EOF
//allocate memory for the final ciphertext
char *imagecipherCBC = (char *)malloc(sizeof(image)); //wrong also
//read first 54 bytes (header)
rewind(image);
fread(headerBuf,54,1,image);
//read the bitmap image until the end of the file
fread(imageBuf,sizeof(image),1,image); //also wrong
sizeof(image)равноsizeof (FILE*), аsizeof(FILE*)не зависит от размера файла. - person EOF   schedule 29.03.2019fstatat()является разумным вариантом, при условии, что вы читаете файлы, а не общие (недоступные для поиска) потоки. - person EOF   schedule 29.03.2019struct, который сообщит вам размер изображения. Затем вы можете выделить память для растрового изображения и прочитать его. - person Weather Vane   schedule 29.03.2019size_t bytes; while((bytes = fread(buffer, 1, sizeof buffer, image)) != 0) { fwrite(buffer, 1, bytes, test); }- person Weather Vane   schedule 29.03.2019fread(), чтобы получить фактические данные в файле.FILE *, которое вы возвращаете изfopen, является просто непрозрачным дескриптором, который вы используете для других вызовов. - person Carl Norum   schedule 29.03.2019