如何将C#.NET TextReader光标重置回起点?

时间:2009-05-06 19:51:09

标签: c# .net file

我有一个方法,它接受StringReader实例(从剪贴板读取)或StreamReader实例(从文件读取),并且目前将一个实例转换为{{1实例。

我需要它'预读'一些源输入,然后将光标重置回到开始。我不一定有原始文件名。我该怎么做?

提到了TextReader Seek System.IO.Stream方法,但TextReader中没有实现此方法,尽管它位于StreamReader Basestream属性中。但是StringReader没有BaseStream属性

4 个答案:

答案 0 :(得分:37)

取决于TextReader。如果是StreamReader,您可以使用:

sr.BaseStream.Position = 0;
sr.DiscardBufferedData();

(当然,假设基础流是可以寻找的。)

TextReader的其他实现可能不会具有“倒带”的概念,就像IEnumerable<T>没有的那样。在许多方面,您可以将TextReader视为荣耀的IEnumerable<char>。它有方法一次读取整个数据块,读取行等,但它基本上是一种“前向读取”类型。

编辑:我不相信StringReader支持任何类型的倒带 - 如果可以的话,最好从原始字符串重新创建StringReader。如果这不可行,您可以始终创建自己的TextReader类,该类代理对另一个StringReader的所有“正常”调用,但在需要时重新创建该代理实例。

答案 1 :(得分:10)

如果是StreamReader if 该流支持搜索,则:

        reader.BaseStream.Seek(0, SeekOrigin.Begin);
        reader.DiscardBufferedData();

但是,任意TextReader都无法做到这一点。你也许可以把它全部读成一个字符串,那么你可以反复使用StringReader吗?

答案 2 :(得分:3)

我遇到了你的帖子,并且相当沮丧,这是不可能的。我快速破解了一些有用的东西:完全避免使用stringreader:

Stream stream = new MemoryStream((new System.Text.ASCIIEncoding().GetBytes(mystring)), false);
reader = new StreamReader(stream, new System.Text.ASCIIEncoding());

它不漂亮,它使用ASCII(这是我需要的)。请注意,使用不同的编码时,这将不起作用,因为您将寻找不等于第n个字符的第n个字节。如果你确实需要,你可以做类似

的事情
Stream stream = new MemoryStream((new System.Text.UTF32Encoding().GetBytes(mystring)), false);
reader = new StreamReader(stream, new System.Text.UTF32Encoding());

因为UTF32是唯一的固定长度unicode格式。

您现在可以

reader.BaseStream.Position = wherever; // or wherever * 4 for the UTF32 variety,
                                       // in your case, the beginning of the string,
                                       // which is always 0 obviously
reader.DiscardBufferedData();

答案 3 :(得分:-3)

寻求,你们会找到。

Seek(0, SeekOrigin.Begin);

TextReader源自StreamReaderStreamReader包含BaseStream属性