2009-08-20 103 views
2

我正在嘗試使用代碼(下面粘貼)讀取文本文件,但文件的最後一行沒有被讀取。我的邏輯正確嗎?StreamReader.EndOfStream缺少最後一行?

 using (StreamReader reader = new StreamReader(stream)) 
     { 
      try 
      { 
       string line = reader.ReadLine(); 
       string[] data = BreakLine(line); 


       while (!reader.EndOfStream) 
       { 
        data = BreakLine(line); 
        DataRow dr = _DataTable.NewRow(); 
        // protect against overflow 
        int maxColumns = Math.Min(_DataTable.Columns.Count, data.Length); 
        for (int i = 0; i < maxColumns; i++) 
        { 
         dr[i] = data[i]; 
        } 
        _DataTable.Rows.Add(dr); 
        line = reader.ReadLine(); 
       } 
       return _DataTable; 
      } 
      finally 
      { 
       reader.Close(); 
       reader.Dispose(); 
       stream.Close(); 
      } 
     } 

回答

10

這裏的問題:因爲你有這樣的:

line = reader.ReadLine(); 

爲您while循環的最後一行,它會讀取的最後一行,然後丟棄它,因爲while條件將返回false。

我認爲你需要這樣的:

try 
{ 
    while (!reader.EndOfStream) 
    { 
     string line = reader.ReadLine(); 
     string[] data = BreakLine(line); 
     DataRow dr = _DataTable.NewRow(); 
     // protect against overflow 
     int maxColumns = Math.Min(_DataTable.Columns.Count, data.Length); 
     for (int i = 0; i < maxColumns; i++) 
     { 
      dr[i] = data[i]; 
     } 
     _DataTable.Rows.Add(dr); 
    } 
    return _DataTable; 
} 
finally 
{ 
    ... 

所以你剛纔讀的每一行,你每次做一輪循環的第一件事。既然你爲一個「讀者」使用塊

finally 
{ 
    reader.Close(); 
    reader.Dispose(); 

,它會自動獲得處置你,即使有一個: -

+2

另一個選擇是使用一個do-while循環,併爲reader.Peek()!= -1 – Breakthrough 2009-08-20 18:03:00

+0

進行while條件檢查我同意突破,只需使用腳控循環,事情就可以正常工作。可悲的是,今天大多數程序員並不在乎什麼時候使用什麼樣的循環。 – 2009-08-20 19:15:37

+1

@Breakthrough,@BeowulfOF:當給定一個空文件時,你的do-while循環如何工作? – RichieHindle 2009-08-20 20:54:27

5

一個快速提示你不需要這個finally塊例外。