我有以下文本文件: 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可能会将数据转换为大字符。我需要帮助下一步,即如何将此char转换为流或任何更好的解决方案。您有什么推荐的吗?
编辑:很多好的答案,所选择的一个对我来说有利于对代码的更改是最小的并且足够通用,我可以在代码的其他类似部分中使用它,其中几个输入文件具有不同的结构被解析。
答案 0 :(得分:4)
我猜你实际上并不想在你的代码中嵌入一个文本文件,所以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";
然后,不是使用ifstream(“g.dat”),而是使用stringstream(gdat),并获得一个流,为了您的目的,它实际上是相同的。
答案 1 :(得分:2)
将它放入初始化的double数组中。一般形式是
double my_values [16] = { 1.234, 2.345, ...等.. };
答案 2 :(得分:2)
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
};
答案 3 :(得分:2)
使用(或编写)某些程序(可能是一个小awk
或python
或ocaml
脚本)将您的g.dat
文件转换为 C file。
修改您的构建过程(例如您的Makefile
),为原始g.dat
文件中生成的 C 文件添加依赖项。
编译生成的 C 文件,并将其链接到二进制文件中。
答案 4 :(得分:0)
这将定义和初始化gt
和gc
数组,类似于您当前的代码。请注意,这些不是动态分配的,因此您在完成后无需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
};