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(或_popen在 Windows 中),这将允许您从另一个进程中读取标准。

你会做类似的事情FILE *fout = popen(micromegas.c_str(), "r");而不是systemandfopen行。

于 2013-07-30T14:37:49.260 回答
0

system不允许您访问子进程的错误或输出。如果您想要最简单的解决方案,那么您已经在使用它了。

如果你想让事情变得更复杂,你需要做一些事情:

  1. 使用forkandexec而不是system. System 是一个简写,更简单的版本。 fork将制作您的内存空间的完整副本,同时exec将用您正在执行的程序覆盖您当前的内存。
  2. 完成此操作后,您可以制作管道。管道是父进程和子进程之间的通信方式。

有很多关于如何做到这一点的例子,包括将 exec 输出重定向到缓冲区或文件

于 2013-07-30T14:38:23.283 回答
0

您可以定义具有类型的向量double:如果您只需要一次保存一个值,则不必声明大于 size=1 的向量。然后,如果您想存储更多值,则可以将值保存到向量中值使用push_back().

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

要访问向量中的任何值,您可以使用以下命令:

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