当我使用文本阅读器时,什么是检测我实际上处于数据末尾的最佳方法?这样做的通常方法如下所示,

    while(reader.Peek() != -1)
    {
       ///do stuff
    }

但是,msdn文档here声明以下内容



因此,我的问题是,如何确定您是否真正处于读者数据的末尾,或者读者/底层流根本不支持搜索,因为此处的返回值似乎是模棱两可的?如果例如我有以下
    public void Parse(TextReader reader)
    {
         while(reader.Peek() != -1) //am I really at the end
         {
            //do stuff
         }
    }

    Parse(new StreamReader(new NetworkStream(....)));

因为networkstream不支持搜寻。

还是我错过了什么?

编辑:

为了澄清起见,我可以使用更具体的StreamReader类轻松实现此目的,因为我可以检查EoS。但是,为了使事情更笼统,我想使用TextReader,因此我不仅仅局限于StreamReader。但是Peek的语义似乎有些奇怪,为什么它不只是在不支持查找的情况下抛出,并且为此为什么TextReader没有EoF属性?

最佳答案

这实际上取决于您在解析中正在执行的操作。

我通常只是Read,看看读了多少。我建议不要一次读一个字符:

char[] buffer = new char[1024 * 16];
int charsRead;
while ((charsRead = read.Read(buffer, 0, buffer.Length)) > 0)
{
    // Process buffer, only as far as charsRead
}

关于c# - TextReader.Peek行为并检测流/阅读器的结尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13650668/

10-12 07:39