Как я могу узнать, когда я достиг конца файла при использовании метода ReadBlock в C #? - PullRequest
22 голосов
/ 23 июня 2011

Я заметил, что он будет возвращать одни и те же прочитанные символы снова и снова, но мне было интересно, есть ли более элегантный способ.

Ответы [ 5 ]

46 голосов
/ 23 июня 2011
while(!streamReader.EndOfStream)
{
    string line = streamReader.ReadLine();
    Console.WriteLine(line);
}
Console.WriteLine("End of File");
4 голосов
/ 23 июня 2011

Проверка StreamReader.EndOfStream . Остановите цикл чтения, когда это true.

Убедитесь, что ваш код правильно обрабатывает возвращаемое значение для "количества прочитанных байтов" также для вызовов ReadBlock. Похоже, вы видите, что прочитано ноль байтов, и просто предполагаете, что неизмененное содержимое буфера, которое вы видите, является другим чтением тех же данных.

2 голосов
/ 16 октября 2013

К сожалению, я пока не могу комментировать ответы, но к ответу "The Moof" ...

Использование cur здесь неуместно, так как параметр index предназначен дляиндекс в buffer, где начинается запись.Так что для ваших примеров его следует заменить на 0 в вызове stream.ReadBlock.

2 голосов
/ 23 июня 2011

Когда возвращаемая длина чтения меньше, чем запрашиваемая длина чтения, вы в конце. Вы также должны следить за длиной чтения в случае, если размер вашего потока не идеально соответствует размеру буфера, поэтому вам необходимо учитывать более короткую длину данных в вашем буфере.

do{
     len = stream.ReadBlock(buffer, 0, buffer.Length);
     /* ... */
  }while(len == buffer.Length);

Вы также можете проверить флаг EndOfStream потока в состоянии цикла. Я предпочитаю этот метод, так как вы не будете выполнять чтение длины '0' (редкое условие, но это может произойти).

do{
      len = stream.ReadBlock(buffer, 0, buffer.Length);
      /* ... */
  }while(!stream.EndOfStream);
1 голос
/ 23 июня 2011

С MSDN для ReadBlock():

Возвращаемое значение Тип: System.Int32 Положение основного потока продвинулся по количеству символов которые были прочитаны в буфер. Число символов, которые были прочитаны. число будет меньше или равно рассчитывать, в зависимости от того, все ли вход символы были прочитаны.

Так что я бы предположил, что это EOF, когда он возвращает 0,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...