使用StreamReader.EndOfStream的问题

本文关键字:问题 EndOfStream StreamReader 使用 | 更新日期: 2023-09-27 18:13:53

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

使用StreamReader.EndOfStream的问题

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

我个人总是使用"读取一行直到它为空"的方法-有时通过扩展方法,这样我就可以使用

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

EnumerateLines将是TextReader上使用迭代器块的扩展方法。(这意味着你也可以很容易地将它用于LINQ等)

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

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

这样,你让。net负责所有的EOF/EOL管理,而你专注于你的内容。

不,你不会遇到任何问题。如果你看一下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是你的阅读器的实际类型,这是不漂亮的开始。

可以将其全部读入字符串,然后解析它:StreamReader.ReadToEnd()

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

嗯,StreamReader是TextReader的专门化,在某种意义上,StreamReader继承自TextReader。所以应该不会有问题。:)

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