2011-08-13 5 views
4

C# 프로젝트에서는 streamreader를 사용하고 있습니다. 1 문자를 되돌릴 필요가 있습니다 (기본적으로 실행 취소하는 것과 같음). 다음 문자를 얻으려면 다음 문자를 가져올 때와 동일해야합니다. 당신이C# 롤백 Streamreader 1 문자

안녕하세요

다시

예를 들어 압연 우리 할

H

E

,

L

L

O

[공백]

T

H

E

R < - 우리 UN 는 R

그래서 ..

R < 할 - 위치에서 거친 아이디어

+0

스트림을 읽을 때처럼 불가능하다고 생각합니다. 반환하고 발전하며 사라졌습니다. 아마도 파일과 메모리 스트림에서 가능할 수도 있지만 네트워크 스트림을 생각해보십시오. 당신은 데이터를 읽습니다. 그리고 그것은 들어오는 것입니다. 그것은 처리되고 영원히 사라졌으며, 어딘가에 "저장"되어 있지 않습니다. 그러나 메모리 스트림과 같이 구체적으로 이것을 원한다면 안전하지 않은 코드로 가서 포인터 계산을하고 i * 생각하면됩니다. –

답변

-3

마이너스 하나입니다 취소 한

R

E

을 :

var bytes = Encoding.ASCII.GetBytes("String"); 
Stream stream = new MemoryStream(bytes); 
Console.WriteLine((char)stream.ReadByte()); //S 
Console.WriteLine((char)stream.ReadByte()); //t 
stream.Position -= 1; 
Console.WriteLine((char)stream.ReadByte()); //t 
Console.WriteLine((char)stream.ReadByte()); //r 
Console.WriteLine((char)stream.ReadByte()); //i 
Console.WriteLine((char)stream.ReadByte()); //n 
Console.WriteLine((char)stream.ReadByte()); //g 
+0

StreamReader의 경우 BaseStream 속성에 액세스하여 위치를 설정합니다. –

+0

고마워, 그럴테니까 – Steven

+0

모든 스트림에 CanSeek() == true가있는 것은 아닙니다. –

2

Read() 대신 값을 원하면 Peek()을 사용하면 값을 확인할 수 있습니다. 스트림을 진행하지 않고 있습니다. 또 다른 접근법은 (내 코드 중 일부에서 사용) 은 값을 다시 푸시 할 수있는 내부 버퍼가있는 리더 (또는 내 경우에는 Stream)를 캡슐화하는 것입니다. 버퍼가 항상 먼저 사용되므로 다시 감을 필요없이 값 (또는 조정 된 값)을 스트림으로 쉽게 푸시 할 수 있습니다 (여러 스트림에서 작동하지 않음).

1

깨끗한 해결책은 StreamReader에서 클래스를 파생시키고 Read() 함수를 재정의하는 것입니다.

사용자의 요구 사항에 따라 간단하게 private int lastChar을 사용하면 Pushback() 메소드를 구현할 수 있습니다. 보다 일반적인 해결책은 무제한 푸시 백을 허용하기 위해 Stack<char>을 사용하는 것입니다.

//untested, incomplete 
class MyReader : StreamReader 
{ 
    public MyReader(Stream strm) 
     : base(strm) 
    { 
    } 

    private int lastChar = -1; 
    public override int Read() 
    { 
     int ch; 

     if (lastChar >= 0) 
     { 
      ch = lastChar; 
      lastChar = -1; 
     } 
     else 
     { 
      ch = base.Read(); // could be -1 
     } 
     return ch; 
    } 

    public void PushBack(char ch) // char, don't allow Pushback(-1) 
    { 
     if (lastChar >= 0) 
      throw new InvalidOperation("PushBack of more than 1 char"); 

     lastChar = ch; 
    } 
}