2009-08-20 3 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 вернет ложь.

Я думаю, что вам нужно это:

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 
{ 
    ... 

Таким образом, вы просто прочитать каждую строку как первое, что вы делаете каждый раз вокруг петли.

+2

Еще один вариант - использовать цикл do-while и сделать проверку состояния для читателя. Peek()! = -1 – Breakthrough

+0

Я согласен с прорывом, просто используйте педаль, контролируемую педалью, и все отлично работает , К сожалению, большинство программистов сегодня не заботятся о том, когда использовать какой цикл. –

+1

@Breakthrough, @BeowulfOF: Как бы работал цикл while-while при получении пустого файла? – RichieHindle

5

Быстрая подсказка - вам не нужно это в блоке, наконец:

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

Поскольку у вас есть, используя блок для «читателя», он будет автоматически получать расположены для вас, даже если есть исключение.

Смежные вопросы