Я пытаюсь прочитать файл в память, используя fread
. Из того, что я понимаю, fread
берет буфер, в который вы хотите записать, размер каждого элемента, который вы хотите прочитать в байтах, количество элементов, которые вы хотите прочитать, а затем указатель файла.
Я использую fseek
, чтобы найти размер файла, используемого для выделения достаточного пространства в моем буфере данных для записи.
Когда я запускаю код, у меня возникает ошибка, и я не знаю, почему. Это ошибка, которую я получаю:
./main
File Size: 786447
make: *** [Makefile:22: run] Segmentation fault (core dumped)
Эта ошибка возникает в строке, содержащей fread
, что заставляет меня думать, что она не выделяет достаточно памяти, но я проверил размер файла. Кажется, он должен быть достаточно большим.
Ниже приведен простой пример файла с ошибкой segfault.
Test. c
#include "test.h"
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uchar;
int readFile(const char* filename) {
FILE* fp;
int sz;
uchar* data;
fp = fopen(filename, "r");
if (fp != NULL) {
fseek(fp, 0L, SEEK_END);
sz = ftell(fp);
printf("File Size: %d\n", sz);
rewind(fp);
data = (uchar*)malloc(sz);
fread(&data, sizeof(uchar), sz, fp);
//later do things with data
fclose(fp);
return 0;
}
return 1;
}
Я заметил одну действительно странную вещь. Я знаю, что sizeof(data)
даст мне 8
на моей машине, потому что это размер указателя на 64-битной машине. Однако, если я читаю 8 или менее байтов в fread, это не вызывает ошибки.
По сути, в строке fread(&data, sizeof(uchar), sz, fp);
, если sz >8
вызывает ошибки.
Сначала я подумал, что, возможно, проблема в том, что я читал слишком большой файл, но, конечно, вы можете читать больше 8 байтов за раз, верно?