Что является символом для конца файла filestream?

Я ищу в цикле while для определенного символа, чтобы проверить, достиг ли он конца файла.

Какой символ я могу найти?

Например:

Indexof('/n')  end of line
Indexof(' ') end of word
???? ---------- end of file??

Ответ 1

Конец потока достигается, когда Stream.Read возвращает ноль.

Пример из 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));
    }
}

или,

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

Ответ 2

Возможно, что вы ищете, это

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

Ответ 3

Когда FileStream возвращает 0, это не означает, что у вас есть конец файла. У меня был такой опыт.

От MSDN: Общее количество байтов, считанных в буфере. Это может быть меньше количества запрошенных байтов, если это количество байтов недоступно в настоящее время, или ноль, если конец потока достигнут.

Это происходит на медленном устройстве, таком как thumbdrive.

Ответ 4

Нет символа EOF. Вызовите FileStream.Read в цикле. Когда .Read() возвращает 0 без чтения байтов, вы закончили.

Документы очень понятны в этом поведении.

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

Метод Read возвращает ноль только после достижения конца потока. В противном случае Read всегда считывает по крайней мере один байт из потока перед возвратом. Если данные не доступны из потока при вызове Read, метод блокируется до тех пор, пока не будет возвращен хотя бы один байт данных. Реализация может возвращать меньшее количество байтов, чем запрошено, даже если конец потока не был достигнут.

Ответ 5

В строке (или даже в файле) нет символа конца символа файла. Длина строки известна (свойство Length), поэтому она не нужна

При чтении файла вы можете проверить:

  • if Stream.Read возвращает 0
  • если StreamReader.ReadLine возвращает null

Ответ 6

Нет такого символа. Если вы вызовете FileStream.ReadByte, он вернет -1 для конца файла. Метод Read возвращает нулевые байты. Если вы используете StreamReader вокруг потока, его метод ReadLine возвращает значение null или его свойство EndOfStream возвращает true.

Ответ 7

Иногда вы не хотите читать всю строку. Например, если строка очень длинная или сохранение строки во временной переменной не является полезной.

В этих случаях вы можете использовать функцию Peek() в StreamReader. Когда он возвращает -1, вы в конце. Например:

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