3

我想写一个程序来解决一个简单的猜谜游戏。我正在学习命令行管道和重定向,所以我想知道这是否可能。

基本上我希望一个的输出成为另一个的输入,然后那个的输出成为另一个的输入。

这只是为了好玩,所以我可以学习,我知道我可以更改猜谜游戏的源代码并包含求解算法,但只是为了好玩让我们假设我没有源代码。

这甚至可能吗?这是我的代码:

//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;
}

求解器.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;
    }
}

我希望你明白我在做什么,我不太关心这个程序,它只是一个例子。主要问题是您是否可以使用重定向和管道等与两个不同的程序进行交互。谢谢

4

2 回答 2

4

根据定义,管道是一种单向通信设备。然而,它可以通过使用两根管道来解决,每个方向一根。问题是它不能通过外壳轻松完成,您必须编写一个程序来设置管道,为您的程序创建进程,然后使用设置为正确输入/输出通道的管道执行它们。

我可以考虑如何通过 shell 实现这一点的唯一方法是使用mkfifo命令创建两个管道。在后台启动一个程序,输入和输出从/到正确的管道重定向,然后对另一个程序执行相同的操作,但使用另一个管道作为输入和输出。

于 2012-12-26T17:59:07.553 回答
3

管道是单向的。如果你用你选择的编程语言打开一个管道,你必须自己处理创建两个管道。

Korn shell 系列提供的双向 I/O 的传统抽象是协同进程。名称中带有“ksh”的 shell 的语法大多是可移植的。

ksh93 / mksh / 其他 pdkshes:

{ cmd1...; } |& cmd2 <&p >&p

Bash 和 Zsh 尽管有许多相同的特性,但有不同的、不兼容的语法。例如,Bash 添加了一个额外的关键字并将 FD 分配给一个数组。

coproc { cmd1; }; cmd2 <&"${COPROC[0]}" >&"${COPROC[1]}"

协同进程的主要替代方案是进程替换、普通管道和命名管道,但它们本身不是双向的。

于 2012-12-26T18:12:16.220 回答