2009-08-20 5 views
2

J'essaye de lire un fichier texte en utilisant le code (collé ci-dessous), mais la dernière ligne du fichier n'est pas lue. Ma logique est-elle correcte?StreamReader.EndOfStream manque la dernière ligne?

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

Répondre

10

Voici le problème: parce que vous avez ceci:

line = reader.ReadLine(); 

comme la dernière ligne de la boucle while, il lit la dernière ligne, puis le jeter parce que la condition while retournera false.

Je pense que vous avez besoin ceci:

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

Vous venez de lire chaque ligne comme la première chose que vous faites à chaque fois autour de la boucle.

+2

Une autre option est d'utiliser une boucle do-while, et de faire la vérification de la condition pendant reader.Peek()! = -1 – Breakthrough

+0

Je suis d'accord avec Breakthrough, il suffit d'utiliser une boucle contrôlée par le pied et les choses vont bien . Malheureusement, la plupart des programmeurs d'aujourd'hui ne se soucient pas de savoir quand utiliser ce type de boucle. –

+1

@Breakthrough, @BeowulfOF: Comment votre boucle do-while fonctionnerait-elle quand un fichier vide est donné? – RichieHindle

5

Une astuce rapide - vous n'avez pas besoin de ce dans le bloc finally:

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

Puisque vous avez un bloc en utilisant pour « lecteur », il obtiendra automatiquement disposé pour vous, même s'il y a une exception.

Questions connexes