使用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
。既然可以轻松地使用TextReader
编写代码,为什么不这样做呢?这样,如果你需要使用StringReader
(或类似的东西)进行单元测试等,就不会有任何困难。
我个人总是使用"读取一行直到它为空"的方法-有时通过扩展方法,这样我就可以使用
foreach (string line in reader.EnumerateLines())
{
}
那么 EnumerateLines
将是TextReader
上使用迭代器块的扩展方法。(这意味着你也可以很容易地将它用于LINQ等)
或者您可以使用ReadAllLines
,以简化您的代码:
这样,你让。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);
}