Использовать содержимое файла как жестко заданную строку

Я ищу простой способ использовать содержимое файла как жестко заданную строковую константу.

Конечно, я мог бы просто скопировать/вставить содержимое файла в define, но это потребовало бы от меня поставить \ в конце каждой строки и перед каждым ".

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

Изменить: Как встроить файл в исполняемый? фокусируется на встраивании двоичных файлов. Я просто хочу использовать содержимое текстового файла как жестко закодированную строку. Предлагаемые методы слишком тяжелы для того, что я хочу сделать.


person Detonar    schedule 04.10.2018    source источник
comment
Возможный дубликат Как встроить файл в исполняемый файл?   -  person KamilCuk    schedule 04.10.2018
comment
Обработка файлов просто не может выполняться во время компиляции в C++.   -  person Some programmer dude    schedule 04.10.2018
comment
@Kamil Cuk - Это слишком тяжело. Я не хочу вставлять бинарные файлы. Просто используйте содержимое текстового файла во время компиляции.   -  person Detonar    schedule 04.10.2018


Ответы (1)


Самый простой способ — скопировать и вставить содержимое в ваш файл заголовка/реализации, но в виде необработанного строкового литерала, т.е.

constexpr const char *fileContent = R"~(FILE_CONTENT_GOES_HERE)~";
//               begin raw literal: ^^^^                      ^^^ end raw literal

где вы должны заменить FILE_CONTENT_GOES_HERE на неизмененное содержимое файла. Обратите внимание, что разделитель (здесь: ~) можно выбрать по-разному, см. здесь для деталей.

Необработанные строковые литералы — это функция С++ 11, которая освобождает вас от необходимости экранировать что-либо (кавычки, символы новой строки и т. д.). Обратите внимание, что в C++17 вы можете дополнительно связать строковый литерал с экземпляром std::string_view и/или объявить переменную как inline.

person lubgr    schedule 04.10.2018
comment
Работает на меня. Не знал о необработанных строковых литералах. Спасибо. - person Detonar; 04.10.2018