Перемещение указателя в StreamReader

У меня есть файл, содержащий блоки (заголовок и тело). Мне нужно разделить блоки. Заголовок 'he=', а тело может быть любым, например. «валун тяжелый». Таким образом, типичный файл может выглядеть так

he=солнечный деньhe=валун тяжелыйhe=всем привет

Я использую метод Read StreamReader для чтения посимвольно.

В программе, используя оператор if, я проверяю наличие h e и =, чтобы определить, является ли его заголовок. Но рассмотрите слово тяжелый. Мне нужен способ переместить указатель файла обратно в h, так как это не заголовок.

Есть ли способ переместить указатель файла в StreamReader? Приведенный выше пример тела заголовка — просто игрушечный пример для объяснения.


person blue piranha    schedule 13.11.2013    source источник
comment
нет, ты не можешь. StreamReader предназначен только для прямого чтения, и вы можете просматривать, не потребляя следующий символ. возможно, вам лучше всего взглянуть на FileStream. У него есть метод Seek. msdn.microsoft.com/en -нас/библиотека/   -  person Ahmed ilyas    schedule 13.11.2013
comment
Это большой файл? Было бы эффективнее загружать большие объемы данных и анализировать файл в памяти.   -  person Stefan    schedule 13.11.2013
comment
@Stefan Это большой файл размером 400 МБ. Я бы не хотел вспоминать об этом.   -  person blue piranha    schedule 13.11.2013
comment
Затем попробуйте использовать патроны, если это возможно. Чтение файла - на байт - действительно неэффективно.   -  person Stefan    schedule 13.11.2013


Ответы (1)


Поскольку StreamReader работает только вперед, вы не можете вернуться назад. Однако не все потеряно. Распространенной тактикой является использование переменной buffer и ее проверка. Вот примерный код:

var buffer = new StringBuilder();

while(streamReader.Peek() >= 0)
{
    //Add latest character to buffer
    buffer.append(streamReader.Read());

    //Check the three rightmost characters in the buffer for the occurance of he=
    if(buffer.Length >= 3 && buffer.ToString().Substr(buffer.Length-3, 3) == "he=")
    {
        //We have found new header. Now we trim the header from the rest of the buffer to get the body
        var newBody = buffer.ToString().Substr(0,buffer.Length-3);
        //I'm assuming you'll be adding the body somewhere
        bodies.Add(newBody);
        //Now we clear the buffer
        buffer.Clear();
    }
}
//What's left in the buffer is also a body
bodies.Add(buffer.ToString());
person System Down    schedule 13.11.2013