2012-05-08 2 views
2

c를 내가 콘솔에서 특수 문자를 제거하는 기능 .. 예를 작성했습니다 :콘솔에서 특수 문자를 제거 - 내가 작성하는 경우 #

Console.WriteLine("Hello World"); 

을 내가 문자로 함수를 호출 한 후 'O'는 내가

Console.SetCursorPosition(i,j); 
와 콘솔을 통해 실행중인 모든 생각

"Hell Wrld" 

: 같은 콘솔이 될 것입니다

하지만 "CursorPosition"의 값을 얻을 수 없습니다 ..

아무 생각하세요?

답변

1

이미 콘솔에 기록 된 내용을 읽을 수있는 방법이 없습니다. 그러나 할 수있는 한 가지 방법은 자체 출력 스트림을 제공하는 것입니다. 필터 문자와 함께 원본 출력 스트림이 지정된 자체 구현 TextWriter을 만들 수 있습니다. 그런 다음 콘솔의 출력 스트림을 새 스트림으로 설정할 수 있습니다. 그 후 언제든지 사용자가 프로그램 출력 스트림에 쓸 때마다 선택한 문자를 필터링합니다.

다음 코드 줄을 사용하여 몇 가지 간단한 테스트를 실행했으며 정상적으로 작동하는 것 같습니다. 더 복잡한 사례가 없는지 알려주세요.

Console.SetOut(new FilteringTextWriter(new[] { 'o' }, Console.Out)); 
+0

굉장 ..! 멋진 아이디어, 감사합니다 :) – Worrior

0

Console.CursorLeftConsole.CursorTop은 커서 위치의 "가져 오기"메소드입니다.

+2

그리고이 방법은 현재 커서 위치에있는 문자를 읽습니까 : 다른 곳 어딘가에 홈페이지 또는

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); } } } 

? – Servy

+1

왜 downvote? OP의 유일한 실제 질문은 CursorPosition의 값을 얻는 방법이었습니다. OP는 SetCursorPosition을 참조 했으므로 질문의 위치는 위치에 관한 것입니다. 나는 그 질문에 대답했다. 그게 왜 downvote의 가치가 무엇입니까? 나는 궁극적으로 OP가 그 인물을 원한다는 것을 이해한다 ... 그러나 그것은 질문 된 문제의 부분이 아니다. – Tim

+1

커서 위치의 값이 위치의 인덱스라고 가정하면 OP는 "값"이라고 말하면 그 위치에있는 문자를 분명히 의미합니다.문자 그대로의 질문 자체는 다소 모호하지만 질문의 문맥은 그가 정말로 요구하고있는 것이 커서의 위치가 아니라 주어진 위치의 성격이라는 것을 분명히합니다. – Servy

0

콘솔 버퍼에서 읽을 수 없습니다. 즉, 콘솔에 이미 쓰여진 내용을 가져올 수 없습니다. (C#에서 직접 실행하지만 네이티브 Windows API 또는 Interop을 사용하여 수행 할 수 있습니다.)

그래서, 아마도 당신은 더 나은

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 Framework에서 수행 할 방법이 없다는 것을 의미합니다. 네이티브 API를 사용하여 거의 모든 것을 할 수 있다는 것을 알고 있습니다. 또한 Interop을 사용하여 기본 API를 사용할 수 있습니다. – JotaBe

관련 문제