Я хочу написать программу для решения простой игры в догадки. Я изучаю трубопроводы командной строки и перенаправления, и поэтому мне было интересно, возможно ли это вообще.
По сути, я хочу, чтобы выходные данные одного были входом другого, а затем выходные данные этого элемента — входом другого.
Это все просто для удовольствия, поэтому я могу учиться, я знаю, что могу изменить исходный код игры в догадки и включить алгоритм решения, но просто для забавы, давайте предположим, что у меня нет исходного кода.
Это вообще возможно? Вот мой код:
//GuessingGame.cc
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
srand(time(NULL));
int number = rand()%100;
int guess = -1;
int trycount = 0;
while(guess != number && trycount < 8) {
cout << "Please enter a guess: ";
cin >> guess;
if(guess < number)
cout << "Too low" << endl;
else if(guess > number)
cout << "Too high" << endl;
trycount++;
}
if(guess == number)
cout << "You guessed the number!";
else
cout << "Sorry, the number was: " << number;
return 0;
}
Solver.cc
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[]) {
string prompt;
int high = 100;
int low = 0;
int guess = 50;
getline(cin,prompt);
if(prompt == "Please enter a guess: ")
cout << guess;
while(true) {
getline(cin,prompt);
if(prompt == "Too low")
low = guess;
else if(prompt == "Too high")
high = guess;
else if(prompt == "You guessed the number!")
return 0;
guess = (low+high)/2;
cout << guess;
}
}
Надеюсь, вы понимаете, что я делаю, и меня не волнует программа, это всего лишь пример. Главный вопрос заключается в том, можете ли вы взаимодействовать с двумя разными программами, используя перенаправления и конвейеры и тому подобное. Спасибо
Труба по определению является устройством односторонней связи. Однако это можно решить, используя две трубы, по одной в каждом направлении. Проблема в том, что это не может быть легко выполнено через оболочку, вам нужно создать программу для настройки каналов, создать процессы для ваших программ и затем выполнить их с каналами, настроенными как правильные каналы ввода / вывода.
Единственный способ, которым я могу думать о том, как сделать это возможным через оболочку, — это использовать mkfifo
Команда создать две трубы. Запустите одну программу в фоновом режиме с перенаправлением ввода и вывода из / в правильные каналы, а затем проделайте то же самое с другой программой, но используйте другой канал в качестве входа и выхода.
Трубы односторонние. Если вы открываете канал на выбранном вами языке программирования, вам придется самостоятельно создавать два канала.
Традиционная абстракция для двустороннего ввода-вывода, предоставляемая семейством оболочек Korn, — это сопроцесс. Синтаксис для оболочек с «ksh» в их именах в основном переносимый.
ksh93 / mksh / другие pdkshes:
{ cmd1...; } |& cmd2 <&p >&p
Bash и Zsh, хотя и имеют много одинаковых функций, имеют разные несовместимые синтаксисы. Например, Bash добавляет дополнительное ключевое слово и назначает FD массиву.
coproc { cmd1; }; cmd2 <&"${COPROC[0]}" >&"${COPROC[1]}"
Основными альтернативами сопроцессам являются замены процессов, обычные конвейеры и именованные каналы, но сами по себе они не являются двунаправленными.