簡體   English   中英

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

[英]Embedding text file in c++ code

我有以下文本文件: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 是我將數據轉換為大字符的可能性。 我需要下一步的幫助,即如何將此字符轉換為流或任何更好的解決方案。 您有什么推薦的嗎?

編輯:很多好的答案,對我來說,選擇的答案具有以下優點:對代碼的更改很小並且足夠通用,我可以在代碼的其他類似部分中使用它,其中解析了幾個具有不同結構的輸入文件。

我猜你實際上並不想在你的代碼中嵌入一個文本文件,所以 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"),並獲得一個流,就您的目的而言,它實際上是相同的。

將它放入您初始化的雙精度數組中。 一般形式是

double my_values[16] = { 1.234, 2.345, ... etc .. };

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文件添加依賴g.dat

編譯生成的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
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM