Я новичок и пытаюсь написать программу для физических расчетов.
В настоящее время выходные данные, генерируемые дочерней программой, отправляются в отдельный текстовый файл, и родительская программа открывает этот файл позже и считывает из него значение — выходные данные не нужно хранить, важно только значение. Было бы более элегантно использовать буфер для этой цели, чтобы в процессе не создавался дополнительный текстовый файл.
Мой вопрос заключается в том, как получить выходные данные, отправленные в буфер вместо файла (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»
Итак, я думаю, что вы ищете popen
(или же _popen
в Windows), что позволит вам считать стандарт из другого процесса.
Вы бы сделали что-то вроде FILE *fout = popen(micromegas.c_str(), "r");
вместо system
а также fopen
линий.
system
не позволяет получить доступ к ошибке или выводу дочернего процесса. Если вы хотите самое простое решение, вы уже используете его.
Если вы хотите сделать вещи более сложными, вам нужно сделать несколько вещей:
fork
а также exec
вместо system
, Система является сокращенной, более простой версией этого. fork
сделает полную копию вашего пространства памяти, в то время как exec
перезапишет вашу текущую память программой, которую вы используете.Есть много примеров того, как это сделать, в том числе Перенаправление вывода exec в буфер или файл
Вы можете определить вектор с типом double
:
если вам просто нужно сохранять одно значение за раз, вам не нужно объявлять вектор больше, чем size = 1. Затем вы можете сохранить свое значение в векторе, если хотите сохранить больше значений, используйте push_back()
,
vector<long> Vec (size);
Vec.push_back(the result of calculation);
Для доступа к любому значению из вектора вы можете использовать следующее:
temporaryNumber=Vec[i];