【问题标题】:C#: Detaching Console input from console outputC#:从控制台输出中分离控制台输入
【发布时间】:2013-10-11 10:59:22
【问题描述】:

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

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

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

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

我的问题归结为:有什么方法可以将输入流与输出流分离?也欢迎解决此问题的替代方法。

【问题讨论】:

    标签: c# stream console


    【解决方案1】:

    控制台类是一个奇怪的野兽。你将需要 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。

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多