Скажем, у меня есть 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. Кроме того, я хотел знать, есть ли способ прочитать вывод этой программы из исходной программы, которая ее запустила.
Как это сделать, зависит от платформы.
Под окнами используйте 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
Я знаю, что для этого проще всего использовать 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;
}
В C на платформах, чье имя оканчивается на X (т.е. не Windows), ключевыми компонентами являются:
pipe
— Возвращает пару файловых дескрипторов, так что то, что написано в одном, может быть прочитано из другого.
fork
— Разветвляет процесс на два, оба продолжают выполнять один и тот же код.
dup2
— Перенумеровывает файловые дескрипторы. При этом вы можете взять один конец канала и превратить его в стандартный вывод или стандартный вывод.
exec
— Прекратите запуск текущей программы, запустите другую, в том же процессе.
Объедините их все, и вы получите то, что просили.
Это мое решение, и оно сработало:
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
Попробуйте это решение 🙂
Похоже, вы пришли из среды 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 тоже не является общепринятым стандартом.