¿Cómo puedo saber cuándo he llegado al final del archivo cuando uso el método ReadBlock en C#?
streamreader (5)
Compruebe StreamReader.EndOfStream . Detenga su ciclo de lectura cuando esto sea true
.
Asegúrese de que su código maneje correctamente el valor devuelto para el "recuento de bytes que se acaba de leer" también en ReadBlock
llamadas de ReadBlock
. Parece que está viendo cero bytes leídos, y suponiendo que el contenido del búfer no modificado es otra lectura de los mismos datos.
Noté que volverá a repetir los mismos caracteres de lectura, pero me preguntaba si había una forma más elegante.
Cuando la longitud de lectura devuelta es menor que la longitud de lectura solicitada, estás al final. También debe estar al tanto de la longitud de la lectura en caso de que el tamaño de su flujo no coincida perfectamente con el tamaño de su búfer, por lo que debe tener en cuenta la menor longitud de los datos en su búfer.
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(len == buffer.Length);
También puede verificar el indicador EndOfStream
del flujo en su condición de bucle también. Prefiero este método ya que no leerá ''0'' (condición rara, pero puede suceder).
do{
len = stream.ReadBlock(buffer, 0, buffer.Length);
/* ... */
}while(!stream.EndOfStream);
De MSDN para ReadBlock()
:
Tipo de valor de retorno: System.Int32 La posición de la secuencia subyacente se avanza por el número de caracteres que se leyeron en el búfer. El número de caracteres que se han leído. El número será menor o igual a contar, dependiendo de si se han leído todos los caracteres ingresados.
Asumiría que es EOF cuando devuelve 0,
Desafortunadamente, no puedo comentar las respuestas todavía, pero a la respuesta de "The Moof" ...
Su uso de cur
aquí está fuera de lugar, ya que el parámetro de index
es para el índice en el buffer
donde debe comenzar la escritura. Entonces, para sus ejemplos, debe ser reemplazado por 0
en la llamada a stream.ReadBlock
.
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");