3

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

4

6 回答 6

5

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

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

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

EnumerateLinesTextReader然后将是使用迭代器块的扩展方法。(这意味着您也可以轻松地将其用于 LINQ 等。)

于 2011-11-08T08:27:31.807 回答
3

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

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

通过这种方式,您可以让 .NET 处理所有 EOF/EOL 管理,并专注于您的内容。

于 2011-11-08T08:26:23.977 回答
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 是你的阅读器的实际类型,这从一开始就不是很好。

于 2011-11-08T08:28:34.313 回答
0

嗯,StreamReaderTextReader的一个特化,从某种意义上说 StreamReader 从 TextReader 继承。所以应该没有问题。:)

于 2011-11-08T08:27:19.093 回答
0

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

using (StreamReader sr = new StreamReader(path)) 
{
  //This allows you to do one Read operation.
  string contents = sr.ReadToEnd());
}
于 2011-11-08T08:28:59.167 回答
0
            var arpStream = ExecuteCommandLine(cmd, arg);
            arpStream.ReadLine(); // Read entries
            while (!arpStream.EndOfStream)
            {
                var line1 = arpStream.ReadLine().Trim();
                //   TeststandInt.SendLogPrint(line, true);
            }
于 2020-01-16T19:43:00.593 回答