C # откат Streamreader 1 символ - PullRequest
       6

C # откат Streamreader 1 символ

4 голосов
/ 13 августа 2011

Для проекта C # я использую Streamreader, мне нужно вернуться назад на 1 символ (в основном, как отмена), и мне нужно, чтобы он изменился, чтобы при получении следующего символа он был таким же, как и при откате

Например

Привет!

мы делаем

H

Е

L

L

O

[пробел]

T

H

E

R <- мы отменяем R </p>

так ..

R <- отменить </p>

R

E

это грубая идея

Ответы [ 3 ]

2 голосов
/ 13 августа 2011

Если вы не знаете, хотите ли вы значение, вместо Read() используйте Peek() - тогда вы можете проверить значение без продвижения потока.Другой подход (который я использую в своем коде) заключается в инкапсуляции считывателя (или в моем случае Stream) в классе, который имеет внутренний буфер, который позволяет вам возвращать значения обратно.Буфер всегда используется первым, что позволяет легко помещать значения (или даже: скорректированные значения) обратно в поток без необходимости перематывать его (что не работает для ряда потоков).

1 голос
/ 13 августа 2011

Чистым решением было бы извлечь класс из 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;
    }
}
0 голосов
/ 13 августа 2011

Минус один с позиции:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...