2010-02-18 3 views
0

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

+0

У вас есть дубликаты: http://stackoverflow.com/questions/1074362/embedded-resource-in-c Поиск в этом отношении затруднен из-за использования «ресурсов» и «управления» в других контекстах в C++, но я считаю, что я видел вопросы по Linux и Mac ... – dmckee

+0

linux dup: http://stackoverflow.com/questions/72616/embed-data-in-ac-program (ранний порядковый номер тоже) – dmckee

+0

Если вы хотите сделать это полностью самостоятельно, это библиотека и/или конкретная операционная система - добавьте в какую среду вы хотите это сделать. –

ответ

-2

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

+2

Я не думаю, что вы ответили на правильные вопросы здесь ... – dmckee

+0

Я отвечал на левые :) –

3

Встраивание означает, что вы распространяете свою программу без файла?

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

Кстати, в Windows у вас может быть удача внедрить ваши данные в resource file.

+0

Ну, что я действительно пытаюсь сделать, это чтобы моя программа могла генерировать действительный файл, например .png-файл, изнутри движка. Я хочу, чтобы иметь возможность затем сгенерировать эти файлы на диск, вроде как zip-файл. – Jeff

2

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

2

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

// 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), чтобы открыть дескриптор псевдодаля из данных и передать его на ваш код обработки файлов.

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

+0

Существуют программы, которые будут транслировать файлы данных в пару файлов C (заголовок и тело) для вас. Там, вероятно, также программы, которые могут упаковывать данные непосредственно в файлы объектных ссылок, но, очевидно, это менее портативный хак. – Steve314

+0

Хотя это решение работает с небольшими файлами, я испытал гигантские времена компиляции в Visual Studio (с файлом 4 КБ). Также Visual Studio начинает отставать, если вы открываете файл, содержащий массив .... – Tara

Смежные вопросы