2

次のテキスト ファイルがあります: 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はデータを大きな文字に変換する可能性があります. 次のステップ、つまり、この文字をストリームに変換する方法、またはより良い解決策があれば、助けが必要です。おすすめは何ですか?

編集:多くの良い答え、選択されたものには、コードへの変更が最小限であり、構造が異なるいくつかの入力ファイルが解析されるコードの他の同様の部分で使用できるほど一般的であるという利点があります。

4

5 に答える 5

4

コードにテキストファイルを実際に埋め込みたくないと思います。そのため、問題に対するはるかに合理的な解決策について、BlastfurnaceとKyleCが回答しました。

しかし、実際にテキストファイルをコードに埋め込み、それをストリームとして読み込みたい場合、それを行う最も簡単な方法は次のようなものです。

まず、テキストファイルを文字列として埋め込みます。

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)を使用して、目的に応じて実質的に同一のストリームを取得できます。

于 2012-05-24T01:33:19.613 に答える
2

ファイルをCファイルに変換するには、何らかのプログラム (小さなawkorpythonまたはocamlスクリプトなど) を使用 (または作成) します。g.dat

ビルド プロシージャ (例: ) を変更して、生成されたCファイルの依存関係を元のファイルからMakefile追加します。g.dat

生成されたCファイルをコンパイルし、バイナリにリンクします。

于 2012-05-24T05:22:58.087 に答える
2

初期化する double の配列に入れます。一般的な形式は

double my_values[16] = { 1.234、2.345、... など .. };

于 2012-05-23T23:51:29.447 に答える
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
};
于 2012-05-23T23:55:31.050 に答える
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
};
于 2012-05-24T00:51:46.453 に答える