Как я могу получить содержимое файла во время сборки в мою строку C ++? - PullRequest
4 голосов
/ 15 мая 2010

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

Другими словами, я бы хотел # включить файл, но он должен быть в двойных кавычках.

Как я могу сделать это в C ++?

А что если этот файл содержит двойные кавычки как часть его текста, как мне их избежать?

Ответы [ 5 ]

5 голосов
/ 15 мая 2010

Вы можете использовать xxd -i /tmp/your_file > /tmp/your_file_as_string.c

Который определит для вас строковый литерал:

$ cat /tmp/your_file_as_string.c
unsigned char _tmp_inc[] = {
  0x2e, 0x2f, 0x42, 0x61, 0x74, 0x63, 0x68, 0x2f, 0x6e, 0x65, 0x78, 0x74,
  0x4f, 0x6f, 0x6c, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f,
  ...
  0x74, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x65, 0x63,
  0x0a
};
unsigned int _tmp_inc_len = 1513;

Теперь вы можете использовать эту заданную строку.

2 голосов
/ 18 января 2013

Чтобы правильно создать заголовок с правильным нулевым окончанием в строке, используйте sed:

xxd -i ${INPUT_FILE_NAME} | sed s/}\;/,0x00}\;/ > ${INPUT_FILE_PATH}.h

Подробнее см. http://gamesfromwithin.com/quick-tip-working-with-shaders-on-ios.

2 голосов
/ 15 мая 2010

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

1 голос
/ 15 мая 2010

Попробуйте проверить, есть ли в вашем компиляторе / компоновщике программа под названием что-то вроде bin2obj. Если он существует, он обычно берет любой файл и генерирует файл .o или .obj, который вы можете указать компоновщику для ссылки в вашу программу. (Как это сделать, зависит от среды сборки.)

Как правило, в результате вы получите один или два символа, которые вы можете сделать видимыми для своего кода, например:

extern "C" const char * myFile_start;
extern "C" unsigned int myFile_size;

Компоновщик удостоверится, что myFile_start указывает на начало вашего файла, а myFile_size дает указание длины.

Имена символов могут различаться: вы можете использовать утилиты objdump или nm или dumpbin (опять же, в зависимости от комплекта компилятора / компоновщика), чтобы исследовать сгенерированные .o или .obj, чтобы найти имена символов (если они еще не задокументированы в документации по вашему инструменту obj2bin).

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

(Если у вас нет bin2obj, вы можете найти его, если поищете в поисковой системе «bin2obj» с вашим именем компилятора / IDE.)

1 голос
/ 15 мая 2010

Очевидный (хотя и несколько наивный) способ состоит в том, чтобы сделать системный вызов и вызвать cpp -x c++ file.cpp, а затем прочитать содержимое потока непосредственно в строку, точно так же, как и при любой другой операции чтения файла.

Это вызывает препроцессор C на file.cpp в режиме C ++, который в точности идентичен выполнению #include ... на нем. Это значение будет затем сохранено в объекте string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...