2

我试图编写一个从控制台中删除特殊字符的函数。例如,如果我写:

Console.WriteLine("Hello World");

在我用字符 'o' 调用函数后,控制台将如下所示:

"Hell Wrld"

我想过在整个控制台上运行

Console.SetCursorPosition(i,j);

但我无法获得“CursorPosition”的值..

任何的想法?

4

4 回答 4

2

您可以读取已写入控制台的内容!

在 .NET 中没有读取控制台缓冲区的方法,但是您可以调用几个 WinAPI 函数来完成工作。

查看GetStdHandle()GetConsoleScreenBufferInfo()ReadConsoleOutput()

于 2012-05-08T18:43:31.597 回答
1

您无法读取已写入控制台的内容。但是,您可以做的一件事是提供您自己的输出流。您可以制作自己的TextWriter实现,将原始输出流与过滤器字符一起提供。然后您可以将控制台的输出流设置为新的,之后任何人写入您的程序输出流时,它都会过滤您选择的字符。

我已经使用以下代码行运行了一些简单的测试,它似乎工作得很好。让我知道它是否不涵盖任何更复杂的情况。

public class FilteringTextWriter : TextWriter
{
    private HashSet<char> invalidChars;
    private TextWriter destinationStream;
    public FilteringTextWriter(IEnumerable<char> invalidChars, TextWriter destinationStream)
        : base()
    {
        this.invalidChars = new HashSet<char>(invalidChars);
        this.destinationStream = destinationStream;
    }
    public override void Write(char value)
    {
        if (!invalidChars.Contains(value))
        {
            destinationStream.Write(value);
        }
    }
}

在 Main 的其他地方或某处:

Console.SetOut(new FilteringTextWriter(new[] { 'o' }, Console.Out));
于 2012-05-08T18:45:14.510 回答
0

Console.CursorLeft并且Console.CursorTop是光标位置的“get”方法。

于 2012-05-08T18:33:07.027 回答
0

您无法从控制台缓冲区读取,即您无法获取已写入控制台的内容。(直接在 C# 中,但您可以使用本机 Windows API 或使用互操作)。

因此,也许您最好将 Console 类包装在您自己的类中,并在将字符串写入屏幕之前对其进行过滤,

 public MyConsole
 {
     // expose the neede methods:
     public void WriteLine(string text)
     {
         Console.WriteLine(text.Replace(...)); // filter out the special chars
     }
 }

然后使用MyConsole而不是Console.

于 2012-05-08T18:43:06.943 回答