2010-03-11 14 views

Odpowiedz

12

Koniec Stream zostanie osiągnięty, gdy Stream.Read zwraca zero.

Przykład z 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)); 
    } 
} 

lub

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

Szybki palec pierwszy! – anijhaw

+0

jaki byłby rozmiar "b" (tablica bajtów), jeśli metoda odczytu metody FileStream zwraca 0? – Brij

6

Może to, czego szukasz, jest to

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

Nie ma „znaku końca pliku "w ciągu znaków (lub nawet w pliku). Długość łańcucha jest znany (Length nieruchomości), więc nie jest to konieczne

Podczas odczytu pliku, można sprawdzić:

  • jeśli Stream.Read zwraca 0
  • jeśli StreamReader.ReadLine zwraca NULL
4

Nie ma znaku EOF. Zadzwoń pod numer FileStream.Read w pętli. Gdy .Read() zwraca 0, ponieważ nie przeczytano żadnych bajtów, skończysz.

Dokumenty są bardzo jasne na temat tego zachowania.

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

odczytanego metoda zwraca zero dopiero po osiągnięciu końca strumienia. W przeciwnym razie Read zawsze odczyta co najmniej jeden bajt ze strumienia przed powrotem. Jeśli żadne dane nie są dostępne ze strumienia po wywołaniu funkcji Odczyt, metoda zostanie zablokowana, dopóki nie zostanie zwrócony co najmniej jeden bajt danych. Implementacja może zwrócić mniej bajtów niż żądano, nawet jeśli nie został osiągnięty koniec strumienia.

+0

@istepaniuk, stan docs "Read method zwraca zero tylko po osiągnięciu końca strumienia". http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx Kiedy widziałeś inne zachowanie? –

+0

@ sammuel-neff Masz rację, stoję poprawiony, będzie to co najmniej jeden, nigdy zero. Usunięto głosowanie oddano; – istepaniuk

+1

@istepaniuk, dzięki za odpowiedź. Cytowanie dokumentów jest lepsze niż samo składanie oświadczenia, więc cieszę się, że dałeś mi dobry powód, by edytować moją odpowiedź. –

2

Nie ma takiego charakteru. Jeśli wywołasz FileStream.ReadByte, zwróci -1 dla końca pliku. Metoda Read zwraca odczytane bajty zerowe. Jeśli używasz StreamReadera wokół strumienia, jego metoda ReadLine zwraca wartość null lub jego właściwość EndOfStream zwraca true.

+0

Dzięki za wzmiankę o 'FileStream.ReadByte'. –

5

Kiedy FileStream zwraca 0, nie oznacza to, że masz koniec pliku. Miałem takie doświadczenie.

Od MSDN: Łączna liczba bajtów wczytanych do bufora. Może to być mniej niż liczba żądanych bajtów, jeśli ta liczba bajtów wynosi obecnie niedostępna lub zero, jeśli zostanie osiągnięty koniec strumienia.

Stanie się to na wolnym urządzeniu, takim jak thumbdrive.

-1

Czasami nie chcesz przeczytać całej linii.Na przykład, jeśli linia jest bardzo długa, lub zapisanie ciągu znaków w zmiennej tymczasowej nie jest użyteczne.

W takich przypadkach można użyć Peek() funkcyjnego na StreamReader. Kiedy zwraca -1, jesteś na końcu. Na przykład:

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