2016-12-14 3 views
1

Я пытаюсь загрузить двоичный файл в массив символов. Мой код:Чтение бинарного файла 300MB для массива char

int MAX_FILE_SIZE = 1 000 000 
FILE *f; 
char buffer[MAX_FILE_SIZE]; 
f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
if (f) 
    n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 

Он работает, пока не установлено MAX_FILE_SIZE в чем 1M ничего большего, потому что я получаю program.exe has stopped working. Если я думаю, что правильно загружать все sample.bin в память, я должен установить MAX_FILE_SIZE в ~ 300M. Как я могу это сделать?

+4

Это не проверяемый примера, но я подозреваю, что вы бежите из stackspace. – EOF

+5

Используйте некоторую выделенную кучу память (например, 'malloc'). –

+0

Вы пробовали сделать свой буфер 'static'? Это будет выделять пространство в сегменте данных вместо стека. –

ответ

4

Там нет C синтаксис для определения большого числа с разделителями для блоков цифр: int MAX_FILE_SIZE = 1 000 000 должны быть написаны int MAX_FILE_SIZE = 1000000;.

Выделение большого массива как локального объекта с автоматическим хранилищем может привести к неопределенному поведению. Общее пространство, доступное для этого, зависит от системы, но может быть меньше одного мегабайта. Я предлагаю вам выделить буфер с malloc() и освободить его после использования:

size_t MAX_FILE_SIZE = 300000000; // 300MB 

int read_file(void) { 
    FILE *f; 
    int n = -1; 
    char *buffer = malloc(MAX_FILE_SIZE); 
    if (buffer == NULL) 
     return -1; 
    f = fopen("sample.bin", "rb"); //sample.bin is 300MB binary file 
    if (f) { 
     n = fread(buffer, sizeof(char), MAX_FILE_SIZE, f); 
     // perform what ever task you want 
     fclose(f); 
    } 
    free(buffer); 
    return n; 
} 
2

В зависимости от вашей платформы и компилятора некоторые ограничения устанавливаются на допустимые распределения в стеке (это то, куда идет ваш буфер). Если вы хотите загрузить весь файл в память, вам придется использовать кучу (используйте malloc). Таким образом, вместо:

char buffer[MAX_FILE_SIZE]; 

использование:

char *buffer; 
if ((buffer = malloc(sizeof(char) * MAX_FILE_SIZE)) == 0) { 
    // exit or some other action to take as your OS failed to allocate 
} 
+0

Этот точный код не будет работать хорошо, потому что «буфер» немедленно выйдет из области действия, если условие не выполнено. – HolyBlackCat

+0

Nice catch. Благодарю. –