【发布时间】:2013-10-02 14:42:57
【问题描述】:
当我使用文本阅读器时,检测我实际上处于数据末尾的最佳方法是什么?执行此操作的通常方法是 类似 以下,
while(reader.Peek() != -1)
{
///do stuff
}
但是,msdn 文档 here 声明如下
表示要读取的下一个字符的整数,如果没有更多字符可用或读取器不支持查找,则为 -1。
所以我的问题是,您如何判断您是否真的处于阅读器数据的末尾,或者阅读器/基础流根本不支持搜索,因为这里的返回值似乎模棱两可?如果例如我有以下
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 属性?
【问题讨论】:
-
有什么理由需要使用
Peek而不是Read? -
它是状态机的一部分,所以我可能想也可能不想在当前状态下使用该字节。所以 peek 是我在这里唯一的选择吗?无需维护单独的未使用字节堆栈。
-
那么检查
reader.BaseStream.CanSeek怎么样? -
请问:为什么这么多人使用
.Peek而不是.EndOfStream来检查是否到达流的尽头?使用.Peek有什么优势吗? -
textreader 不公开基本流,因为它可能没有基本流(在字符串阅读器的情况下)。我认为这才是引发这个问题的真正动机。
标签: c# .net textreader