【问题标题】:Use file content as hardcoded string使用文件内容作为硬编码字符串
【发布时间】:2018-10-04 09:45:38
【问题描述】:

我正在寻找一种将文件内容用作硬编码字符串常量的简单方法。

当然,我可以将文件内容复制/粘贴到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,但我想这样做而不需要额外的预构建步骤。

编辑: How to embed a file into an executable? 专注于嵌入二进制文件。我只想将文本文件的内容用作硬编码字符串。 建议的方法对于我想做的事情来说太重了。

【问题讨论】:

  • 文件处理不能在 C++ 编译时完成。
  • @Kamil Cuk - 这太重了。我不想嵌入二进制文件。只需在编译时使用文本文件的内容。

标签: c++ g++ precompiler


【解决方案1】:

最简单的方法是将内容复制粘贴到您的头文件/实现文件中,但作为 raw 字符串文字,即

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

您应该将FILE_CONTENT_GOES_HERE 替换为文件的未修改 内容。请注意,分隔符(此处为:~)可以选择不同的,详情请参阅here

原始字符串字面量是 C++11 的一项功能,它使您无需转义任何内容(引号、换行符等)。请注意,对于 C++17,您可能希望选择将字符串文字绑定到 std::string_view 实例和/或将变量声明为 inline

【讨论】:

  • 为我工作。不知道原始字符串文字。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多