在 C++ 代码中嵌入文本文件

Embedding text file in c++ code

本文关键字:文本 文件 C++ 代码      更新时间:2023-10-16

我有以下文本文件:克.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 是我将数据转换为大字符的可能性。我需要下一步的帮助,即如何将此字符转换为流或任何更好的解决方案。你有什么建议?

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

我猜你实际上并不想在你的代码中嵌入文本文件,所以Heart和Kyle C的答案可以更合理地解决你的问题。

但是,如果您确实想在代码中嵌入文本文件,然后将其作为流读取,最简单的方法是这样的。

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

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

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

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

双my_values[16] = { 1.234, 2.345, ...等。。 };

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
};

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

修改您的构建过程(例如您的Makefile),以从原始g.dat文件为生成的 C 文件添加依赖项。

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

这将

定义和初始化类似于当前代码的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
};