2010-03-11 12 views

Respuesta

12

El final de una corriente se alcanza cuando un Stream.Read devuelve cero.

Un ejemplo de MSDN, FileStream:

// Open a stream and read it back. 
using (FileStream fs = File.OpenRead(path)) 
{ 
    byte[] b = new byte[1024]; 
    UTF8Encoding temp = new UTF8Encoding(true); 
    while (fs.Read(b,0,b.Length) > 0) 
    { 
     Console.WriteLine(temp.GetString(b)); 
    } 
} 

o,

using (StreamReader sr = File.OpenText(filepath)) 
{ 
    string line; 
    while ((line = sr.ReadLine()) != null) 
    { 
      // Do something with line... 
      lineCount++; 
    } 
} 
+1

¡Dedo rápido primero! – anijhaw

+0

¿Cuál sería el tamaño de "b" (matriz de bytes) si el método Read de FileStream devuelve 0? – Brij

6

Tal vez lo que busca es este

using (StreamReader sr = new StreamReader("TestFile.txt")) 
{ 
    String line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     Console.WriteLine(line); 
    } 
} 
3

No hay un "carácter de fin de archivo "en una cadena (o incluso en un archivo). se conoce la longitud de la cadena (Length propiedad), así que no es necesario

Al leer un archivo, se puede comprobar:

  • si Stream.Read devuelve 0
  • si StreamReader.ReadLine devuelve NULL
4

No hay caracteres EOF. Llame al FileStream.Read en un bucle. Cuando .Read() devuelve 0 sin lectura de bytes, listo.

Los documentos son muy claros en este comportamiento.

http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx

de lectura devuelve el método cero solamente después de alcanzar el final de la secuencia. De lo contrario, Read siempre lee al menos un byte de la secuencia antes de volver. Si no hay datos disponibles de la transmisión en una llamada a Leer, el método se bloqueará hasta que se pueda devolver al menos un byte de datos. Una implementación es gratuita para devolver menos bytes de los solicitados, incluso si no se ha alcanzado el final de la secuencia.

+0

@istepaniuk, el estado de documentación "El método de lectura devuelve cero solo después de llegar al final de la secuencia". http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx ¿Cuándo has visto otro comportamiento? –

+0

@ sammuel-neff Tienes razón, estoy corregido, será al menos uno, nunca cero. Se eliminó el voto negativo; – istepaniuk

+1

@istepaniuk, gracias por responder. Citar los documentos es mejor que solo hacer la declaración de todos modos, así que me alegra que me hayas dado una buena razón para editar mi respuesta. –

2

No hay tal carácter. Si llama a FileStream.ReadByte, devolverá -1 para el final del archivo. El método Read devuelve cero bytes leídos. Si usa un StreamReader alrededor de la ruta, su método ReadLine devuelve null o su propiedad EndOfStream devuelve verdadero.

+0

Gracias por la mención de 'FileStream.ReadByte'. –

5

Cuando FileStream devuelve 0, no significa que tiene alcance al final del archivo. Yo tuve experiencia eso.

De MSDN: Número total de bytes leídos en el búfer. Esto podría ser menor que el número de bytes solicitados si ese número de bytes es actualmente no disponible, o cero si se llega al final de la secuencia.

Esto ocurre en dispositivos lentos como unidad de memoria.

-1

A veces no quiere leer toda la línea.Por ejemplo, si la línea es muy larga, o guardar la cadena en una variable temporal no es útil.

En estos casos, se puede utilizar el Peek() función en el StreamReader. Cuando devuelve -1, estás al final. Por ejemplo:

// Reads a CSV file and prints it out line by line 
    public static void ReadAndPrintCSV(string fullyQualifiedPath) 
    { 
     using (System.IO.StreamReader sr = File.OpenText(fullyQualifiedPath)) 
     { 
      string[] lineArray = null; 
      while ((sr.Peek() > -1) && (lineArray = sr.ReadLine().Split(',')) != null) 
      { 
       foreach (string str in lineArray) 
       { 
        Console.Write(str + " "); 
       } 
       Console.WriteLine(); 
      } 
     } 
    } 
Cuestiones relacionadas