[英]Issues using StreamReader.EndOfStream?
所以我正在做一個項目,我正在讀取配置文件。 配置文件只是一個字符串列表,如“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 的問題?
一個明顯的缺點是它使您的代碼StreamReader
特定。 鑒於您可以僅使用TextReader
輕松編寫代碼,為什么不這樣做呢? 這樣,如果您需要使用StringReader
(或類似的東西)進行單元測試等,就不會有任何困難。
就我個人而言,我總是使用“讀取一行直到它為空”的方法 - 有時通過擴展方法,以便我可以使用
foreach (string line in reader.EnumerateLines())
{
}
EnumerateLines
將成為TextReader
使用迭代器塊的擴展方法。 (這意味着您也可以輕松地將它用於 LINQ 等。)
或者您可以使用ReadAllLines
來簡化您的代碼:
http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
通過這種方式,您可以讓 .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 作為您的閱讀器的實際類型,這在開始時並不漂亮。
var arpStream = ExecuteCommandLine(cmd, arg);
arpStream.ReadLine(); // Read entries
while (!arpStream.EndOfStream)
{
var line1 = arpStream.ReadLine().Trim();
// TeststandInt.SendLogPrint(line, true);
}
嗯, StreamReader是TextReader 的特化,從某種意義上說 StreamReader 繼承自 TextReader。 所以應該沒有問題。 :)
也許將它全部讀入一個字符串然后解析它: StreamReader.ReadToEnd()
using (StreamReader sr = new StreamReader(path))
{
//This allows you to do one Read operation.
string contents = sr.ReadToEnd());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.