0

私のプログラムでは、入力ストリームと出力ストリームを操作します。これらは基本的にどのような種類のストリームでもかまいませんが、ほとんどの場合、コンソールの単なる標準入力と出力です。ストリームを初期化する方法は次のとおりです。

StreamReader input = null;
StreamWriter output = null;
/* ... */
if (output == null)
{
    output = new StreamWriter(Console.OpenStandardOutput());
}
if (input == null)
{
    input = new StreamReader(Console.OpenStandardInput());
}

私の問題は、コンソールからの入力が常にコンソールに書き込まれることです。コンソールに書きたくない特殊文字がいくつかあります。より具体的には、たとえばタブを使用してオートコンプリートしたいと考えています。

私が見つけた唯一の解決策は、Console.ReadKey()を使用することでした。ただし、ストリームには同様のメソッドがないため、これは一般的なストリームのサポートを台無しにします。

私の質問は次のとおりです。入力ストリームを出力ストリームから切り離す方法はありますか? これを解決する別の方法も歓迎します。

4

1 に答える 1

1

Console クラスは奇妙な獣です。必要なことを行うには、 Console.ReadKey() が必要になります。問題の 1 つは、それがないと、ユーザーがエンター キーを押すまで、ストリームから入力が得られないことです。これは本当に簡単な例です:

        char inp;
        do {
            var x = Console.ReadKey(true);
            inp = x.KeyChar;
            output.Write(inp);
            if (x.Key == ConsoleKey.Enter) { Console.WriteLine(); }
            } while (inp != 'x');

ストリーム パラダイムに固執したい場合は、次のようなことができます。

    public class ConsoleStream: StreamReader {
        public ConsoleStream(): base(new MemoryStream()) {}
        public override int Read() {
            var key = Console.ReadKey(true);
            return (int) key.KeyChar;
            }
        }

上記の MemoryStream は使用されません。ベース StreamReader を構築できるようにするためだけに使用されます。次のようにクラスを使用します。

        var cin = new ConsoleStream();
        char inp;
        do {
            inp = (char) cin.Read();
            Console.Write(inp);
            if (inp == '\r') { Console.WriteLine(); }
            } while (inp != 'x');

私だったら、ReadKey を直接使用します。

于 2013-10-11T02:59:22.123 に答える