使用StreamReader.EndOfStream的问题?

时间:2011-11-08 08:23:58

标签: c# .net file-io streamreader textreader

所以我正在做一个我在配置文件中阅读的项目。配置文件只是一个字符串列表,如“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的问题?

6 个答案:

答案 0 :(得分:5)

一个明显的缺点是它会使您的代码StreamReader具体化。鉴于您可以使用TextReader轻松编写代码,为什么不这样做呢?这样,如果您需要使用StringReader(或类似的东西)进行单元测试等,就不会有任何困难。

我个人总是使用“读取行直到它为空”的方法 - 有时通过扩展方法使我可以使用

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

EnumerateLines将成为使用迭代器块的TextReader上的扩展方法。 (这意味着你也可以轻松地将它用于LINQ等。)

答案 1 :(得分:3)

或者您可以使用ReadAllLines来简化代码:

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

这样,您可以让.NET负责所有EOF / EOL管理,并专注于您的内容。

答案 2 :(得分:1)

不,你不会遇到任何问题。如果你看一下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是你读者的实际类型,而这一点并不适合开始。

答案 3 :(得分:0)

嗯,StreamReaderTextReader的特化,因为StreamReader继承自TextReader。所以不应该有问题。 :)

答案 4 :(得分:0)

也许把它全部读成一个字符串,然后解析它:StreamReader.ReadToEnd()

using (StreamReader sr = new StreamReader(path)) 
{
  //This allows you to do one Read operation.
  string contents = sr.ReadToEnd());
}

答案 5 :(得分:0)

            var arpStream = ExecuteCommandLine(cmd, arg);
            arpStream.ReadLine(); // Read entries
            while (!arpStream.EndOfStream)
            {
                var line1 = arpStream.ReadLine().Trim();
                //   TeststandInt.SendLogPrint(line, true);
            }