Вывод текста отправляется в файл и используется позже в программе. Как использовать буфер вместо?

Я новичок и пытаюсь написать программу для физических расчетов.

В настоящее время выходные данные, генерируемые дочерней программой, отправляются в отдельный текстовый файл, и родительская программа открывает этот файл позже и считывает из него значение — выходные данные не нужно хранить, важно только значение. Было бы более элегантно использовать буфер для этой цели, чтобы в процессе не создавался дополнительный текстовый файл.

Мой вопрос заключается в том, как получить выходные данные, отправленные в буфер вместо файла (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»

2

Решение

Итак, я думаю, что вы ищете popen (или же _popen в Windows), что позволит вам считать стандарт из другого процесса.

Вы бы сделали что-то вроде FILE *fout = popen(micromegas.c_str(), "r"); вместо system а также fopen линий.

4

Другие решения

system не позволяет получить доступ к ошибке или выводу дочернего процесса. Если вы хотите самое простое решение, вы уже используете его.

Если вы хотите сделать вещи более сложными, вам нужно сделать несколько вещей:

  1. использование fork а также exec вместо system, Система является сокращенной, более простой версией этого. fork сделает полную копию вашего пространства памяти, в то время как exec перезапишет вашу текущую память программой, которую вы используете.
  2. Как только вы это сделаете, вы можете сделать трубу. Трубы — это средство общения между родительским процессом и ребенком.

Есть много примеров того, как это сделать, в том числе Перенаправление вывода exec в буфер или файл

0

Вы можете определить вектор с типом double :
если вам просто нужно сохранять одно значение за раз, вам не нужно объявлять вектор больше, чем size = 1. Затем вы можете сохранить свое значение в векторе, если хотите сохранить больше значений, используйте push_back(),

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

Для доступа к любому значению из вектора вы можете использовать следующее:

temporaryNumber=Vec[i];
0
По вопросам рекламы [email protected]