что символ для конца файла filestream? - PullRequest
13 голосов
/ 11 марта 2010

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

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

Например:

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

Ответы [ 7 ]

16 голосов
/ 11 марта 2010

Конец потока достигается, когда 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++;
     }
}
6 голосов
/ 15 ноября 2012

Когда FileStream возвращает 0, это не значит, что вы достигли конца файла. Я имел опыт этого.

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

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

6 голосов
/ 11 марта 2010

Может быть, то, что вы ищете, это

using (StreamReader sr = new StreamReader("TestFile.txt"))
{
    String line;
    while ((line = sr.ReadLine()) != null)
    {
         Console.WriteLine(line);
    }
}
4 голосов
/ 11 марта 2010

EOF-персонажа нет. Звоните FileStream.Read в цикле. Когда .Read() возвращает 0, если не прочитано ни одного байта, все готово.

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

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

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

3 голосов
/ 11 марта 2010

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

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

  • если Stream.Read возвращает 0
  • если StreamReader.ReadLine возвращает ноль
2 голосов
/ 11 марта 2010

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

0 голосов
/ 04 апреля 2014

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

В этих случаях вы можете использовать функцию 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();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...