C#:从控制台输出中分离控制台输入

时间:2013-10-11 00:19:04

标签: c# stream console

在我的程序中,我使用输入流和输出流。这些可以是任何类型的流,但在大多数情况下,它们只是控制台中的标准输入和输出。以下是流初始化的方式:

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

我的问题是来自控制台的输入始终写入控制台。我有一些特殊字符,我不想写入控制台。更具体地说,我想使用tab来自动完成。

在谷歌上搜索我发现的唯一解决方案是使用Console.ReadKey()。但是,这会破坏我对流的支持,因为流没有类似的方法。

我的问题归结为:有没有办法从输出流中分离输入流?其他解决方法也很受欢迎。

1 个答案:

答案 0 :(得分:1)

Console类是一个奇怪的野兽。您将需要Console.ReadKey()来执行您想要的操作。一个问题是,如果没有它,在用户按下回车键之前,您将不会从流中获得任何输入。这是一个非常简单的例子:

        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。