Я заметил, что он будет продолжать возвращать одни и те же символы чтения снова и снова, но мне было интересно, был ли более элегантный способ.
Как я могу узнать, когда я достиг конца файла при использовании метода ReadBlock в С#?
Ответ 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,