2010-03-11 18 views

risposta

12

Il fine di un flusso viene raggiunta quando una Stream.Read restituisce zero.

Un esempio da 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

Fast Finger First! – anijhaw

+0

quale sarebbe la dimensione di "b" (array di byte) se il metodo Read di FileStream restituisce 0? – Brij

6

Forse quello che stai cercando è questo

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

Non c'è un "carattere di fine del file "in una stringa (o anche in un file). La lunghezza della stringa è noto (Length proprietà), quindi non è necessario

Durante la lettura di un file, è possibile controllare:

  • se Stream.Read restituisce 0
  • se StreamReader.ReadLine restituisce null
4

Nessun carattere EOF. Chiama FileStream.Read in un ciclo. Quando .Read() restituisce 0 per nessun byte letto, hai finito.

I documenti sono molto chiari su questo comportamento.

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

il metodo Read restituisce zero solo dopo aver raggiunto la fine del flusso. Altrimenti, Read legge sempre almeno un byte dallo stream prima di tornare. Se non sono disponibili dati dallo stream su una chiamata a Read, il metodo bloccherà fino a quando non sarà possibile restituire almeno un byte di dati. Un'implementazione è libera di restituire meno byte di quelli richiesti anche se non è stata raggiunta la fine dello stream.

+0

@istepaniuk, lo stato dei documenti "Il metodo di lettura restituisce zero solo dopo aver raggiunto la fine del flusso". http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx Quando hai visto altri comportamenti? –

+0

@ sammuel-neff Hai ragione, sono corretto, sarà almeno uno, mai zero. Rimosso il voto negativo; – istepaniuk

+1

@istepaniuk, grazie per aver risposto. Citando i documenti è meglio che solo fare la dichiarazione comunque, quindi sono felice che tu mi abbia dato una buona ragione per modificare la mia risposta. –

2

Non c'è un tale personaggio. Se chiami FileStream.ReadByte, restituirà -1 per la fine del file. Il metodo Read restituisce zero byte letti. Se si utilizza uno StreamReader attorno allo stream, il suo metodo ReadLine restituisce null o la sua proprietà EndOfStream restituisce true.

+0

Grazie per la menzione di "FileStream.ReadByte". –

5

Quando FileStream restituisce 0, non significa che si raggiunge la fine del file. L'ho vissuto.

Da MSDN: Il numero totale di byte letti nel buffer. Questo potrebbe essere inferiore al numero di byte richiesti se quel numero di byte è non disponibile al momento o zero se viene raggiunta la fine del flusso.

Questo si verifica su dispositivo lento come thumbdrive.

-1

A volte non si desidera leggere l'intera riga.Ad esempio, se la linea è molto lunga, o non è utile salvare la stringa in una variabile temporanea.

In questi casi, è possibile utilizzare il Peek() funzione sul StreamReader. Quando ritorna -1 sei alla fine. Ad esempio:

// 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(); 
      } 
     } 
    } 
Problemi correlati