Как запустить программу из другой программы и передать ей данные через стандартный ввод в c или c ++?

Скажем, у меня есть exe, скажем, sum.exe. Теперь скажите, что код для sum.exe

void main ()
{
int a,b;
scanf ("%d%d", &a, &b);
printf ("%d", a+b);
}

Я хотел знать, как можно запустить эту программу из другой программы на языке c / c ++ и передать ввод через stdin, как это делается на сайтах онлайн-компиляторов, таких как ideone, где я набираю код и предоставляю данные stdin в текстовом поле, и эти данные принимаются программа, использующая scanf или cin. Кроме того, я хотел знать, есть ли способ прочитать вывод этой программы из исходной программы, которая ее запустила.

4

Решение

Как это сделать, зависит от платформы.

Под окнами используйте CreatePipe и CreateProcess. Вы можете найти пример из MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

Под Linux / Unix вы можете использовать dup() / dup2()

Один простой способ сделать это — использовать терминал (например, командную строку в windows) и использовать | перенаправить ввод / вывод.

Пример:

program1 | program2

Это перенаправит вывод программы1 на вход программы2.
Чтобы получить / ввести дату, вы можете использовать временные файлы. Если вы не хотите использовать временные файлы, вам придется использовать трубу.

Для Windows (используйте командную строку):

program1 <input >output

Для Linux вы можете использовать tee утилиту, вы можете найти подробную инструкцию, набрав man tee в терминале Linux

0

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

Я знаю, что для этого проще всего использовать popen() функция. Работает в Windows и UNIX. С другой стороны, popen() позволяет только однонаправленное общение.

Например, чтобы передать информацию sum.exe (хотя вы не сможете прочитать результат), вы можете сделать это:

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *f;

f = popen ("sum.exe", "w");
if (!f)
{
perror ("popen");
exit(1);
}

printf ("Sending 3 and 4 to sum.exe...\n");
fprintf (f, "%d\n%d\n", 3, 4);

pclose (f);
return 0;
}
3

В C на платформах, чье имя оканчивается на X (т.е. не Windows), ключевыми компонентами являются:

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

  2. fork — Разветвляет процесс на два, оба продолжают выполнять один и тот же код.

  3. dup2 — Перенумеровывает файловые дескрипторы. При этом вы можете взять один конец канала и превратить его в стандартный вывод или стандартный вывод.

  4. exec — Прекратите запуск текущей программы, запустите другую, в том же процессе.

Объедините их все, и вы получите то, что просили.

3

Это мое решение, и оно сработало:

sum.cpp

#include "stdio.h"int main (){
int a,b;
scanf ("%d%d", &a, &b);
printf ("%d", a+b);
return 0;
}

test.cpp

#include <stdio.h>
#include <stdlib.h>

int main(){
system("./sum.exe < data.txt");
return 0;
}

data.txt

3 4

Попробуйте это решение 🙂

1

Похоже, вы пришли из среды Windows, поэтому это может быть не тот ответ, который вы ищете, но из командной строки вы можете использовать оператор перенаправления канала ‘|’ перенаправить стандартный вывод одной программы на стандартный другой. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

Вам, вероятно, лучше работать в оболочке bash, которую вы можете получить в Windows с помощью cygwin http://cygwin.com/

Кроме того, ваш пример выглядит как смесь C ++ и C, и объявление main тоже не является общепринятым стандартом.

0
По вопросам рекламы [email protected]