簡體   English   中英

使用 StreamReader.EndOfStream 的問題?

[英]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);
            }

嗯, StreamReaderTextReader 的特化,從某種意義上說 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM