StreamReader, C #, заглядывать - PullRequest
2 голосов
/ 15 ноября 2009

У меня есть StreamReader, который время от времени проверяет, есть ли у него больше информации для чтения из простого текстового файла. Использует свойство peek. Проблема в том, что когда я использую peek, позиция меняется, хотя и не предполагается.

FileStream m_fsReader = new FileStream(
                        m_strDataFileName,
                        FileMode.OpenOrCreate,
                        FileAccess.Read,
                        FileShare.ReadWrite                        );

StreamReader m_SR = new StreamReader(m_fsReader);

Console.WriteLine("IfCanRead SR Position " + m_fsReader.Position +
     " and Length " + m_fsReader.Length);

if (m_SR.Peek() == -1) {
       Console.WriteLine("IfCanRead false 2 SR Position " + 
             m_fsReader.Position  + " and Length " + m_fsReader.Length);

       return false;
}
else {
       Console.WriteLine("IfCanRead true 2 SR Position " + 
           m_fsReader.Position + " and Length " + m_fsReader.Length);

       return true;
}  

Ответы [ 2 ]

13 голосов
/ 15 ноября 2009

Документация указывает, что позиция StreamReader не изменилась, но вы проверяете текущую позицию базового потока, а не позицию самого считывателя. Я не вижу, что это гарантирует, что положение основного потока остается прежним. На самом деле, я подозреваю, что он просто читает его и буферизует внутри, чтобы удерживать курсор читателя в предыдущей позиции. Это будет означать, что это не гарантирует, что позиция базового потока не изменится.

Текущая позиция объекта StreamReader не изменяется при Peek. Возвращаемое значение равно -1, если в данный момент больше нет доступных символов.

6 голосов
/ 15 ноября 2009

Протестировал это сам. Положение базового FileStream изменилось, но ключевой момент заключается в том, что это не означает, что StreamReader на самом деле имеет CONSUMED любых байтов. Так что проблем нет.

...