【问题标题】:Text output sent to file and used later in the program. How to use buffer instead?文本输出发送到文件并稍后在程序中使用。如何改用缓冲区?
【发布时间】:2013-07-30 18:15:28
【问题描述】:

我是一个初学者,正在尝试编写一个物理计算程序。

当前子程序生成的输出被发送到一个单独的文本文件,父程序稍后打开这个文件并从中读取一个值——输出不需要存储,只有值是有意义的。为此目的使用缓冲区会更优雅,因此在此过程中不会生成额外的文本文件。

我的问题是如何将输出发送到缓冲区而不是文件(下面的 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”

【问题讨论】:

    标签: c++ file io-redirection


    【解决方案1】:

    所以,我认为您正在寻找 popen(或 Windows 中的 _popen),这将允许您从另一个进程中读取标准。

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

    【讨论】:

      【解决方案2】:

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

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

      1. 使用forkexec 而不是system System 是一个简写,更简单的版本。 fork 会完整复制你的内存空间,而exec 会用你正在执行的程序覆盖你当前的内存。
      2. 一旦你这样做了,你就可以制作一个管道。管道是父进程和子进程之间的通信方式。

      有很多关于如何做到这一点的例子,包括Redirecting exec output to a buffer or file

      【讨论】:

      • 使用forkexec 还可以使用基本的read 来读取输出数据。使用popen 更容易,它为您完成所有繁重的工作。
      • @MatsPetersson 同意,这就是为什么我在看到它时立即投票赞成你的原因。但是我的提供了一个替代方案以及一个充满其他替代方案(包括 popen)的链接,所以我没有删除我的。
      【解决方案3】:

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

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

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

      temporaryNumber=Vec[i];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 1970-01-01
        • 2016-06-16
        • 1970-01-01
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多