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

コンソールに既に書き込まれた内容を読み取る方法はありません。ただし、できることの 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);
        }
    }
}

メインの他の場所またはどこか:

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 または相互運用機能を使用して実行できます)。

したがって、コンソール クラスを独自のクラスでラップし、画面に書き込む前に文字列をフィルター処理する方がよいでしょう。

 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 に答える