2012-05-23 61 views
2

我有以下的文本文件: g.dat在C嵌入文本文件++代码

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

对不起,如果我不能得到你的问题,但从我的理解你需要这个数据可以通过你的应用程序的生活,而不必读取数据文件。在这种情况下,你在做什么是非常好。您一次读取数据并无休止地使用它。或者你可以按照下面的方式回答建议。 – mawia

+0

其实我想摆脱数据文件,以某种方式插入代码中的文本,然后更改代码,以便'gc'和'gt'最终保留与原始代码中相同的值 – elyase

+0

但我didn没有得到'然后改变代码',是否你的代码覆盖了它自己的行为,也就是说它在运行时正在代替原始二进制代码。正如你可能已经猜到的那样,我对如果你的意思是比这更简单,但是plz会解释.. – mawia

回答

4

我猜测,你实际上并不希望嵌入代码中的一个文本文件,所以答案通过高炉和凯尔下更合理的解决方案,您的问题。

但是,如果你真的实际上是想要在你的代码中嵌入文本文件,然后作为流读取它,最简单的方法是这样的。

首先,嵌入文本文件作为一个字符串:

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”),您可以使用字符串流(gdat),并获得了流是,对你的目的,有效的相同。

+0

如果你打算在多个地方做这个,可能是更大的文件,你真的想研究一个简单的代码生成器来编写代码按照Basile Starynkevitch的回答所述,做出咕噜的工作。 – abarnert

2

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

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

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

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

使用(或写)某些程序,也许一个小awkpythonocaml脚本,改变你的g.dat文件转换成Ç文件。

修改您的构建过程(例如您Makefile)从原始g.dat文件添加用于生成Ç文件的依赖性。

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

+0

如果我不得不这样做,并且g.dat长度超过几行,这正是我所要做的。问题是上面的哪个答案让你的代码生成器输出 - 但说实话,这并不重要。你可以用一个简单的sed单线程生成一个单一的大数组(例如Kyle C的答案),而将其预处理为最终结果(比如Blastfurnace的答案)将更像Python的几行代码, d都很容易。 – abarnert