Проблемы с использованием StreamReader.EndOfStream? - PullRequest
3 голосов
/ 08 ноября 2011

Итак, я делаю проект, в котором я читаю в файле конфигурации.Конфигурационный файл - это просто список строк, таких как «D 1 1», «C 2 2» и т. Д. Теперь я никогда не делал чтения / записи в C #, поэтому я искал его в Интернете, ожидая найти какое-нибудь представлениеC / C ++ .eof ().Я не смог найти один.

Итак, что у меня есть ...

TextReader tr = new StreamReader("/mypath");

Из всех онлайн-примеров того, как я нашел, чтобы прочитать в конец файла два примера.все время происходили

while ((line = tr.ReadLine() != null)

или

while (tr.Peek() >= 0)

Я заметил, что StreamReader имеет bool EndOfStream, но никто не предлагал его, что привело меня к мысли, что с этим решением что-то не так.Я закончил тем, что попробовал это так ...

while (!(tr as StreamReader).EndOfStream)

, и, кажется, он работает просто отлично.

Так что я думаю, у меня вопрос, возникнут ли у меня проблемы с приведением TextReader в качестве StreamReaderи проверка EndOfStream?

Ответы [ 5 ]

5 голосов
/ 08 ноября 2011

Одним очевидным недостатком является то, что он делает ваш код StreamReader специфичным.Учитывая, что вы можете легко написать код, используя TextReader, почему бы не сделать это?Таким образом, если вам нужно использовать StringReader (или что-то подобное) для модульных тестов и т. Д., Никаких сложностей не будет.

Лично я всегда использую подход «читать строку, пока она не станет нулевой»иногда с помощью метода расширения, так что я могу использовать

foreach (string line in reader.EnumerateLines())
{
}

EnumerateLines, тогда это будет метод расширения на TextReader с использованием блока итератора.(Это означает, что вы также можете легко использовать его для LINQ и т. Д.)

3 голосов
/ 08 ноября 2011

Или вы можете использовать ReadAllLines, чтобы упростить ваш код:

http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx

Таким образом, вы позволяете .NET позаботиться обо всем управлении EOF / EOL и сосредоточиться на своем контенте.

1 голос
/ 08 ноября 2011

Нет, у вас не будет проблем. Если вы посмотрите на реализацию EndToStream, вы обнаружите, что он просто проверяет, есть ли еще данные в буфере, и если нет, может ли он читать больше данных из базового потока:

public bool EndOfStream
{
    get
    {
        if (this.stream == null)
        {
            __Error.ReaderClosed();
        }
        if (this.charPos < this.charLen)
        {
            return false;
        }
        int num = this.ReadBuffer();
        return num == 0;
    }
}

Подобное приведение в вашем коде делает его зависимым от того, что StreamReader является фактическим типом вашего ридера, что не очень приятно для начала.

0 голосов
/ 08 ноября 2011

Может быть, прочитать все это в строку, а затем проанализировать:

0 голосов
/ 08 ноября 2011

Ну, StreamReader - это специализация TextReader , в том смысле, что StreamReader наследуется от TextReader.Так что не должно быть проблем.:)

...