2

私は初心者で、物理計算用のプログラムを書こうとしています。

現在、子プログラムによって生成される出力は別のテキスト ファイルに送信され、親プログラムは後でこのファイルを開き、そこから値を読み取ります。出力を保存する必要はなく、値のみが重要です。この目的のためにバッファを使用する方が洗練されているため、プロセスで余分なテキスト ファイルが生成されることはありません。

私の質問は、出力をファイル (以下の micromegas.out) の代わりにバッファに送信し、後で以下のコードで出力ファイルに対して行うのと同じ方法でバッファ内の値を検索する方法です。

string micromegas = "./micromegas_3.2/MSSM/main " + p[0] + " " + p[1] + " " + p[2] + " " + p[3] + " " + p[4] + " > micromegas.out";
// Execute child program and send output to micromegas.out
system(micromegas.c_str());

FILE *fout = fopen("micromegas.out", "r"); // open the output file and search for the value (Omega)
char * buffer =(char *)malloc(512);
long double Xf, calc_omega_hsq;
while(fgets(buffer, 512, fout)) 
{
    if (sscanf(buffer, "Xf=%Lf Omega=%Lf", &Xf, &calc_omega_hsq)) {}
}
fclose (fout);

現在ファイル「micromegas.out」に保存されている出力「====レリック密度の計算===== Xf=2.22e+01 Omega=1.34e+00」

4

3 に答える 3

4

だから、私はあなたが探しているものpopen(または_popenWindowsで)を考えています。これにより、別のプロセスから標準を読み取ることができます。

and行FILE *fout = popen(micromegas.c_str(), "r");の代わりに次のようにします。systemfopen

于 2013-07-30T14:37:49.260 に答える
0

system子プロセスのエラーまたは出力にアクセスできません。最も単純なソリューションが必要な場合は、既にそれを使用しています。

物事をより複雑にしたい場合は、いくつかのことを行う必要があります。

  1. の代わりにforkとを使用します。execsystem System は、これを簡略化した簡単なバージョンです。 実行中のプログラムで現在のメモリを上書きforkしながら、メモリ空間の完全なコピーを作成します。exec
  2. これができたら、パイプを作ることができます。パイプは、親プロセスと子プロセスの間の通信手段です。

Redirecting exec output to a buffer or fileなど、これを行う方法の例はたくさんあります

于 2013-07-30T14:38:23.283 に答える
0

タイプでベクトルを定義できますdouble。一度に 1 つの値を保存する必要がある場合は、 size=1 より大きいベクトルを宣言する必要はありません。さらに保存したい場合は、値をベクトルに保存できます。値を使用しますpush_back()

vector<long> Vec (size);
Vec.push_back(the result of calculation);

ベクトルから任意の値にアクセスするには、次を使用できます。

temporaryNumber=Vec[i];
于 2013-07-30T15:02:24.993 に答える