所以我正在做一个我在配置文件中阅读的项目。配置文件只是一个字符串列表,如“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的问题?
答案 0 :(得分:5)
一个明显的缺点是它会使您的代码StreamReader
具体化。鉴于您可以使用TextReader
轻松编写代码,为什么不这样做呢?这样,如果您需要使用StringReader
(或类似的东西)进行单元测试等,就不会有任何困难。
我个人总是使用“读取行直到它为空”的方法 - 有时通过扩展方法使我可以使用
foreach (string line in reader.EnumerateLines())
{
}
EnumerateLines
将成为使用迭代器块的TextReader
上的扩展方法。 (这意味着你也可以轻松地将它用于LINQ等。)
答案 1 :(得分:3)
或者您可以使用ReadAllLines
来简化代码:
http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
这样,您可以让.NET负责所有EOF / EOL管理,并专注于您的内容。
答案 2 :(得分: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是你读者的实际类型,而这一点并不适合开始。
答案 3 :(得分:0)
嗯,StreamReader是TextReader的特化,因为StreamReader继承自TextReader。所以不应该有问题。 :)
答案 4 :(得分:0)
也许把它全部读成一个字符串,然后解析它:StreamReader.ReadToEnd()
using (StreamReader sr = new StreamReader(path))
{
//This allows you to do one Read operation.
string contents = sr.ReadToEnd());
}
答案 5 :(得分:0)
var arpStream = ExecuteCommandLine(cmd, arg);
arpStream.ReadLine(); // Read entries
while (!arpStream.EndOfStream)
{
var line1 = arpStream.ReadLine().Trim();
// TeststandInt.SendLogPrint(line, true);
}