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

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

私がやっていることを理解していただければ幸いです。プログラムについてはあまり気にしません。これは単なる例です。主な問題は、リダイレクトやパイプなどを使用して、2 つの異なるプログラムと対話できるかどうかです。ありがとう

4

2 に答える 2

4

パイプは、定義上、一方向通信デバイスです。ただし、各方向に 1 つずつ、2 つのパイプを使用することで解決できます。問題は、シェルを介して簡単に実行できないことです。パイプをセットアップするプログラムを作成し、プログラムのプロセスを作成してから、正しい入出力チャネルとしてセットアップされたパイプでそれらを実行する必要があります。

シェルを介してこれを可能にする方法について考えることができる唯一の方法は、mkfifoコマンドを使用して 2 つのパイプを作成することです。入力と出力を正しいパイプとの間でリダイレクトしてバックグラウンドで 1 つのプログラムを開始し、他のプログラムで同じことを行いますが、他のパイプを入力と出力として使用します。

于 2012-12-26T17:59:07.553 に答える
3

パイプは一方通行です。選択したプログラミング言語でパイプを開く場合、2 つのパイプの作成を自分で処理する必要があります。

Korn ファミリーのシェルが提供する双方向 I/O の従来の抽象化は、コプロセスです。名前に「ksh」が含まれるシェルの構文は、ほとんど移植可能です。

ksh93 / mksh / その他のパッケージ:

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

Bash と Zsh は、同じ機能の多くを共有していますが、構文が異なり、互換性がありません。たとえば、Bash は余分なキーワードを追加し、FD を配列に割り当てます。

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

コプロセスの主な代替手段は、プロセス置換、通常のパイプライン、および名前付きパイプですが、それら自体は双方向ではありません。

于 2012-12-26T18:12:16.220 に答える