2012-05-23 86 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