2012-05-08 71 views
2

我試着寫,從控制檯中刪除特殊字符功能.. 例如,如果我寫:從控制檯刪除特殊字符 - C#

Console.WriteLine("Hello World"); 

我打電話與字符功能後「O」時,控制檯會像:

"Hell Wrld" 

我想和

Console.SetCursorPosition(i,j); 
在控制檯中所有正在運行

但我無法獲得「CursorPosition」的值。

任何想法?

回答

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)); 
+0

真棒..!很酷的想法,謝謝:) – Worrior

0

Console.CursorLeftConsole.CursorTop是光標位置的「get」方法。

+2

你怎麼看在當前光標所在位置的字符? – Servy

+1

爲什麼downvote? OP唯一真正的問題是如何獲得CursorPosition的價值。 OP引用SetCursorPosition,所以問題是關於位置。我回答了這個問題。爲什麼這是值得的downvote?我明白,OP最終需要這個角色......但這不是被問及的問題的一部分。 – Tim

+1

你假定光標位置的值是它的位置的索引,當他說「值」時,OP清楚地表示該位置的字符。字面問題本身有些模棱兩可,但問題的上下文清楚地表明,他真正要求的是給定位置上的字符,而不是光標的位置。 – Servy

0

您無法從控制檯緩衝區讀取數據,即無法獲取已寫入控制檯的內容。 (直接在C#中,但可以使用本機Windows API或使用Interop來完成)。

所以,也許你最好換Console類在自己的類,並將其寫入到屏幕前過濾字符串,

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

然後用MyConsole,而不是Console

+2

這有幾個問題。您必須更改整個程序中的所有代碼才能使用新的writeline方法。您必須編寫大量重載以匹配所有現有的控制檯寫入/寫入方法。它可以非常容易地繞過,有意或無意,但使用常規的'Console.Write'方法。 – Servy

+0

有一個更好的解決方案,正如答案中提供的那樣,這是一個破解。 ;) – JotaBe

2

CAN閱讀已寫入控制檯的內容!

沒有方法可以在.NET中讀取控制檯緩衝區,但是可以調用幾個WinAPI函數來完成工作。

退房GetStdHandle()GetConsoleScreenBufferInfo()ReadConsoleOutput()

+0

當然,我的意思是在.NET框架中沒有辦法做到這一點。我知道你可以使用本地API做幾乎任何事情。您可以使用Interop使用本地API。 – JotaBe