2010-03-11 15 views

Antwort

12

Das Ende eines Stroms erreicht wird, wenn ein Stream.Read Null zurückkehrt.

Ein Beispiel aus 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)); 
    } 
} 

oder

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

Schneller Finger zuerst! – anijhaw

+0

Was wäre die Größe von "b" (Byte-Array), wenn die Read-Methode von FileStream 0 zurückgibt? – Brij

6

Vielleicht für das, was Sie suchen, ist diese

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

Es gibt keine „Dateiende Zeichen "in einer Zeichenfolge (oder sogar in einer Datei). Die Länge der Zeichenfolge ist bekannt (Length Eigenschaft), so ist es nicht notwendig,

Wenn Sie eine Datei lesen, können Sie überprüfen:

  • wenn Stream.Read 0 zurück
  • wenn StreamReader.ReadLine gibt null zurück
4

Es gibt kein EOF-Zeichen. Rufen Sie FileStream.Read in einer Schleife. Wenn .Read() 0 zurückgibt für keine Bytes lesen, sind Sie fertig.

Die Dokumente sind zu diesem Verhalten sehr klar.

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

Die Methode gibt Read Null erst nach dem Ende des Stroms erreicht. Ansonsten liest Read immer mindestens ein Byte aus dem Stream, bevor es zurückkehrt. Wenn bei einem Aufruf von Read keine Daten aus dem Stream verfügbar sind, blockiert die Methode, bis mindestens ein Datenbyte zurückgegeben werden kann. Eine Implementierung kann weniger Bytes als angefordert zurückgeben, auch wenn das Ende des Streams nicht erreicht wurde.

+0

@istepaniuk, der Dokumentstatus "Die Methode read gibt erst nach Erreichen des Stream-Endes eine Null zurück". http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx Wann haben Sie anderes Verhalten gesehen? –

+0

@ sammuel-neff Du hast recht, ich stehe korrigiert, es wird mindestens eins sein, niemals null. Die Down-Abstimmung wurde entfernt; – istepaniuk

+1

@istepaniuk, danke für die Antwort. Zitieren der Dokumente ist besser als nur die Aussage sowieso, so bin ich froh, dass Sie mir einen guten Grund gegeben, meine Antwort zu bearbeiten. –

2

Es gibt kein solches Zeichen. Wenn Sie FileStream.ReadByte aufrufen, wird -1 für das Dateiende zurückgegeben. Die Read-Methode gibt null gelesene Bytes zurück. Wenn Sie einen StreamReader für den Stream verwenden, gibt die ReadLine-Methode null zurück oder die EndOfStream-Eigenschaft gibt true zurück.

+0

Danke für die Erwähnung von 'FileStream.ReadByte'. –

5

Wenn FileStream 0 zurückgibt, heißt das nicht, dass Sie das Ende der Datei erreicht haben. Ich hatte Erfahrung damit.

Von MSDN: Die Gesamtzahl der Bytes in den Puffer gelesen. Dies ist möglicherweise weniger als die Anzahl der angeforderten Bytes, wenn die Anzahl der Bytes derzeit nicht verfügbar ist, oder Null, wenn das Ende des Streams erreicht ist.

Dies geschieht auf langsamen Gerät wie Thumbdrive.

-1

Manchmal möchten Sie nicht die ganze Zeile lesen.Wenn die Zeile beispielsweise sehr lang ist oder das Speichern der Zeichenfolge in einer temporären Variablen nicht sinnvoll ist.

In diesen Fällen können Sie die Peek() Funktion auf demStream verwenden. Wenn es -1 zurückgibt, bist du am Ende. Zum Beispiel:

// 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(); 
      } 
     } 
    } 
Verwandte Themen