Подтвердить что ты не робот

Как я могу узнать, когда я достиг конца файла при использовании метода ReadBlock в С#?

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

4b9b3361

Ответ 1

while(!streamReader.EndOfStream)
{
    string line = streamReader.ReadLine();
    Console.WriteLine(line);
}
Console.WriteLine("End of File");

Ответ 2

Отметьте StreamReader.EndOfStream. Остановите свой цикл чтения, если это true.

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

Ответ 3

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

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);

Ответ 4

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

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

Ответ 5

Из MSDN для ReadBlock():

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

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