Встраивание файла в программу - PullRequest
0 голосов
/ 18 февраля 2010

Я хочу встроить файл в программу. Он будет использоваться для файлов конфигурации по умолчанию, если они не указаны. Я понял, что могу просто использовать значения по умолчанию, но я хочу извлечь файл и поместить его на диск, чтобы его можно было изменить.

Ответы [ 4 ]

3 голосов
/ 18 февраля 2010

Под внедрением вы подразумеваете распространение своей программы без файла?

Затем вы можете преобразовать его в код инициализации конфигурации в вашей цепочке инструментов сборки. Добавьте шаг make-файла (или любой другой инструмент, который вы используете) - скрипт, который преобразует этот файл .cfg в некоторый файл кода C ++, который инициализирует структуру данных конфигурации. Таким образом, вы можете просто изменить файл .cfg, перестроить проект и получить новые значения, отраженные внутри.

Кстати, в Windows вам может повезти, встраивая ваши данные в файл ресурсов .

2 голосов
/ 18 февраля 2010

Одна обычная вещь, которую вы можете сделать, это представить данные файла в виде массива статических байтов:

// In a header file:
extern const char file_data[];
extern const size_t file_data_size;

// In a source file:
const char file_data[] = {0x41, 0x42, ... };  // etc.
const size_t file_data_size = sizeof(file_data);

Тогда данные файла будут просто глобальным массивом байтов, скомпилированным в ваш исполняемый файл, на который вы можете ссылаться где угодно. Вам придется либо переписать код обработки файла, чтобы иметь возможность обрабатывать необработанный байтовый массив, либо использовать что-то вроде fmemopen(3), чтобы открыть дескриптор псевдо-файла из данных и передать его код обработки файлов.

Конечно, чтобы получить данные в этой форме, вам нужно будет использовать какой-то шаг предварительной обработки, чтобы преобразовать файл в байтовый массив, который может принять компилятор. Makefile был бы хорош для этого.

2 голосов
/ 18 февраля 2010

Встроенные данные часто называют «ресурсами». C ++ не предоставляет встроенной поддержки, но им можно управлять практически во всех форматах исполняемых файлов. Попробуйте найти менеджеров ресурсов для c ++.

0 голосов
/ 18 февраля 2010

Если это какой-либо Unix, посмотрите на отображение файла в памяти процесса с помощью mmap(2). В Windows есть нечто похожее, но я никогда не играл с ним.

...