Linux — чтение файла C ++ в массив Char

Я использую следующий код для чтения файла в массив chararcter. Теперь для маленького файла (скажем, для 2 МБ) он выполняется правильно, но для большого файла (140 МБ), на моем сервере UBUNTU на 18 ГБ это дает segmentation fault, Кто-нибудь может мне помочь, как решить это? Я думаю, что 18 ГБ достаточно для хранения 240 МБ файла в памяти. Я использую 64-битный UBUNTU и компилирую с помощью g ++.

ifstream is;

char chararray [fileSize] ;

is.read(chararray, fileSize) ;

4

Решение

Если массив является локальной переменной, вы получите переполнение стека, так как он не помещается в стек. Вместо этого выделите «массив» в куче, либо напрямую, используя new или косвенно с помощью std::vector,

Или используйте отображение памяти. Увидеть mmap функция.

5

Другие решения

Вместо того, чтобы размещать массив символов в стеке, я бы попробовал использовать std::vectorкоторый будет динамически распределяться по куча:

std::vector<char> buffer(fileSize);
is.read(&buffer[0], fileSize);
2

Для этого в компиляторе GCC есть команда по умолчанию, называемая size! Скомпилируйте программу с помощью компилятора GCC. Тогда вы можете получить размер файла!

gcc -Wall test.c
size

Это для нормальной программы на C! Поскольку вы не указали ни одного параметра, он принимает ./a.out в качестве параметра по умолчанию!

Если вам придется применить некоторую оптимизацию, код будет выглядеть следующим образом:

praveenvinny@ubuntu:~/Project/New$> gcc -Wall -o1 -fauto-inc-dec test.c -o Output
praveenvinny@ubuntu:~/Project/New$> size output
text       data     bss     dec     hex filename
1067       256      8       1331    533 output

Используйте текстовый раздел для размера кода.
Вы можете использовать data и bss, если вы хотите учитывать и глобальный размер данных.

Это напечатает размер кода,

time -f "%e" -o Output.log ./a.out

напечатает время выполнения в файл журнала, называемый Output.log

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector