Я ищу простой способ использовать содержимое файла в качестве жестко закодированной строковой константы.
Конечно, я мог бы просто скопировать / вставить содержимое файла в define
но это потребовало бы от меня \
s в конце каждой строки и перед каждым "
,
Я пытался использовать constexpr
чтобы прекомпилятор загрузил файл, но либо я сделал что-то не так (я не знаком с constexpr
) или это невозможно.
Вот что я попробовал:
constexpr const char* loadFile()
{
std::string retVar;
std::ifstream file("filename.txt");
retVar = std::string((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>());
return retVar.c_str();
}
#define FILE_CONTENT = loadFile();
Я получаю ошибку:
error: body of constexpr function 'constexpr const char* loadFile()' not a return-statement
Может быть, кто-то может изменить мой код, чтобы он работал так, как ожидалось, или, может быть, у кого-то есть совершенно новый способ достижения моей цели.
Я знаю, что мог бы просто написать скрипт, который читает содержимое файла и преобразует его в #define
но я хотел бы сделать это без дополнительных шагов перед сборкой.
Редактировать:
Как встроить файл в исполняемый файл? фокусируется на встраивании бинарных файлов. Я просто хочу использовать содержимое текстового файла в качестве жестко закодированной строки.
Предложенные методы слишком тяжелы для того, что я хочу сделать.
Самый простой способ — скопировать и вставить содержимое в файл заголовка / реализации, но как сырье строковый литерал, т.е.
constexpr const char *fileContent = R"~(FILE_CONTENT_GOES_HERE)~";
// begin raw literal: ^^^^ ^^^ end raw literal
где вы должны заменить FILE_CONTENT_GOES_HERE
с неизмененный содержание файла. Обратите внимание, что разделитель (здесь: ~
) можно выбрать по-другому, смотрите Вот для деталей.
Необработанные строковые литералы — это функция C ++ 11, которая освобождает вас от необходимости избегать чего-либо (кавычки, переводы строки и т. Д.). Обратите внимание, что в C ++ 17 может потребоваться привязать строковый литерал к std::string_view
экземпляр и / или объявить переменную как inline
,
Других решений пока нет …