StreamReader.EndOfStream отсутствует последняя строка? - PullRequest
2 голосов
/ 20 августа 2009

Я пытаюсь прочитать текстовый файл, используя код (вставленный ниже), но последняя строка файла не читается. Правильна ли моя логика?

        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();
            }
        }

Ответы [ 2 ]

11 голосов
/ 20 августа 2009

Вот проблема: потому что у вас есть это:

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

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

5 голосов
/ 20 августа 2009

Быстрый совет - вам не нужно это в блоке finally:

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

Так как у вас есть блок Using для «reader», он автоматически избавится от вас, даже если есть исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...