【问题标题】:Embedding text file in c++ code在 C++ 代码中嵌入文本文件
【发布时间】:2012-05-30 13:28:06
【问题描述】:

我有以下文本文件: g.dat

16
0.0950125098376374401853193354250
0.281603550779258913230460501460
0.458016777657227386342419442983
0.617876244402643748446671764049
0.755404408355003033895101194847
0.865631202387831743880467897713
0.944575023073232576077988415535
0.989400934991649932596154173450

0.189450610455068496285396723209
0.182603415044923588866763667977
0.169156519395002538189312079058
0.149595988816576732081501730116
0.124628971255533872052476277863
0.0951585116824927848099251053810
0.0622535239386478928628438391746
0.0271524594117540948517805723700

还有下面的 C++ 代码来准备它:

ifstream In;
  In.open(("g.dat").c_str());
  In>>gaussdim;
  gt = new double[gaussdim];
  gc = new double[gaussdim];
  for(int i=0;i<gaussdim/2;i++)
  {
    In>>gt[i];
    gt[gaussdim-i-1]=-gt[i];
  }
  for(int i=0;i<gaussdim/2;i++)
  {
    In>>gc[i];
    gc[gaussdim-i-1]=gc[i];
  }
  In.close();

我想将此数据文件嵌入到我的程序中,以便我可以轻松地重新分发它,而不必总是依赖于处理许多不同的文件。我的目标是 linux 和 mac,所以 xxd 可以让我将数据转换为大字符。我需要下一步的帮助,即如何将此字符转换为流或任何更好的解决方案。你有什么建议吗?

编辑:很多好的答案,选择的答案对我来说具有以下优势,即对代码的更改很小并且足够通用,我可以在代码的其他类似部分使用它,其中有几个具有不同结构的输入文件被解析。

【问题讨论】:

  • 对不起,如果我没有得到您的问题,但据我了解,您需要在应用程序的整个生命周期中访问这些数据,而无需读取数据文件。对吗?在这种情况下,你正在做的很好。您一次读取数据并无休止地使用它。或者你可以按照下面的答案建议的方式去。
  • 实际上我想摆脱数据文件,以某种方式将其作为文本插入代码中,然后更改代码以使'gc'和'gt'最终保持与中相同的值原代码
  • 但是我没有得到'然后更改代码',是不是你的代码正在覆盖它自己的行为,也就是说它在运行时吐出代码,它正在替换原始二进制文件。您可能已经猜到了,我现在对您的需要感到困惑。如果您的意思比这更简单,请道歉,但请解释一下..

标签: c++ linux macos unix


【解决方案1】:

我猜您实际上并不想在代码中嵌入文本文件,因此 Blastfurnace 和 Kyle C 的答案为您的问题提供了更合理的解决方案。

但如果你真的确实真的想将文本文件嵌入到你的代码中,然后将其作为流读入,那么最简单的方法就是这样。

首先,将文本文件嵌入为字符串:

static const char *gdat="16\n"
"0.0950125098376374401853193354250\n"
"0.281603550779258913230460501460\n"
"0.458016777657227386342419442983\n"
"0.617876244402643748446671764049\n"
"0.755404408355003033895101194847\n"
"0.865631202387831743880467897713\n"
"0.944575023073232576077988415535\n"
"0.989400934991649932596154173450\n"
"\n"
"0.189450610455068496285396723209\n"
"0.182603415044923588866763667977\n"
"0.169156519395002538189312079058\n"
"0.149595988816576732081501730116\n"
"0.124628971255533872052476277863\n"
"0.0951585116824927848099251053810\n"
"0.0622535239386478928628438391746\n"
"0.0271524594117540948517805723700\n";

然后,您可以使用 stringstream(gdat) 而不是使用 ifstream("g.dat"),并获得一个实际上相同的流。

【讨论】:

  • 如果您要在多个地方执行此操作,可能使用较大的文件,您真的想考虑编写一个简单的代码生成器来完成繁重的工作,如 Basile Starynkevitch 的回答中所述。
【解决方案2】:

将它放入你初始化的双精度数组中。一般形式是

双我的值[16] = { 1.234, 2.345, ... 等等 .. };

【讨论】:

    【解决方案3】:
    const double data[] = {
        0.0950125098376374401853193354250,
        0.281603550779258913230460501460 ,
        0.458016777657227386342419442983 ,
        0.617876244402643748446671764049 ,
        0.755404408355003033895101194847 ,
        0.865631202387831743880467897713 ,
        0.944575023073232576077988415535 ,
        0.989400934991649932596154173450 ,                                       
        0.189450610455068496285396723209 ,
        0.182603415044923588866763667977 ,
        0.169156519395002538189312079058 ,
        0.149595988816576732081501730116 ,
        0.124628971255533872052476277863 ,
        0.0951585116824927848099251053810,
        0.0622535239386478928628438391746,
        0.0271524594117540948517805723700
    };
    

    【讨论】:

      【解决方案4】:

      使用(或编写)一些程序,可能是一个小的 awkpythonocaml 脚本,将您的 g.dat 文件转换为 C 文件。

      修改你的构建过程(例如你的Makefile),为你原来的g.dat文件中生成的C文件添加一个依赖。

      编译生成的 C 文件,并将其链接到您的二进制文件中。

      【讨论】:

      • 如果我必须做这样的事情,而 g.dat 超过几行,这正是我会做的。问题是上面的哪个答案会让你的代码生成器输出——但老实说,这并不重要。您可以使用简单的 sed 单线生成一个大数字数组(如 Kyle C 的答案),而将其预处理为最终结果(如 Blastfurnace 的答案)更像是几行 Python,但它们一切都很容易。
      【解决方案5】:

      这将定义和初始化 gtgc 数组,类似于您当前的代码。请注意,这些不是动态分配的,因此您在完成后不需要 delete[] 它们。

      double gt[] =
      {
           0.0950125098376374401853193354250, 0.281603550779258913230460501460,
           0.458016777657227386342419442983,  0.617876244402643748446671764049,
           0.755404408355003033895101194847,  0.865631202387831743880467897713,
           0.944575023073232576077988415535,  0.989400934991649932596154173450,
          -0.989400934991649932596154173450, -0.944575023073232576077988415535,
          -0.865631202387831743880467897713, -0.755404408355003033895101194847,
          -0.617876244402643748446671764049, -0.458016777657227386342419442983,
          -0.281603550779258913230460501460, -0.0950125098376374401853193354250
      };
      
      double gc[] =
      {
          0.189450610455068496285396723209,  0.182603415044923588866763667977,
          0.169156519395002538189312079058,  0.149595988816576732081501730116,
          0.124628971255533872052476277863,  0.0951585116824927848099251053810,
          0.0622535239386478928628438391746, 0.0271524594117540948517805723700,
          0.0271524594117540948517805723700, 0.0622535239386478928628438391746,
          0.0951585116824927848099251053810, 0.124628971255533872052476277863,
          0.149595988816576732081501730116,  0.169156519395002538189312079058,
          0.182603415044923588866763667977,  0.189450610455068496285396723209
      };
      

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        • 2012-08-30
        • 2013-10-19
        • 1970-01-01
        • 2014-11-21
        相关资源
        最近更新 更多