web-dev-qa-db-fra.com

Comment savoir quand j'ai atteint la fin du fichier lors de l'utilisation de la méthode ReadBlock en C #?

J'ai remarqué qu'il continuerait de renvoyer les mêmes caractères lus encore et encore, mais je me demandais s'il y avait une manière plus élégante.

23
abw333
while(!streamReader.EndOfStream)
{
    string line = streamReader.ReadLine();
    Console.WriteLine(line);
}
Console.WriteLine("End of File");
49
harryovers

Vérifiez StreamReader.EndOfStream . Arrêtez votre boucle de lecture lorsqu'il s'agit de true.

Assurez-vous que votre code gère correctement la valeur renvoyée pour "le nombre d'octets vient d'être lu" sur les appels ReadBlock. On dirait que vous voyez zéro octet lu, et en supposant simplement que le contenu du tampon inchangé que vous voyez est une autre lecture des mêmes données.

4
Steve Townsend

Malheureusement, je ne peux pas encore commenter les réponses, mais à la réponse de "The Moof" ...

Votre utilisation de cur ici est déplacée, car le paramètre index est pour l'index dans buffer où l'écriture doit commencer. Donc, pour vos exemples, il devrait être remplacé par 0 dans l'appel à stream.ReadBlock.

2
PL-Li2

Lorsque la longueur de lecture retournée est inférieure à la longueur de lecture demandée, vous êtes à la fin. Vous devez également garder une trace de la longueur de lecture au cas où la taille de votre flux ne correspondrait pas parfaitement à la taille de votre tampon, vous devez donc tenir compte de la longueur plus courte des données dans votre tampon.

do{
     len = stream.ReadBlock(buffer, 0, buffer.Length);
     /* ... */
  }while(len == buffer.Length);

Vous pouvez également vérifier le drapeau EndOfStream du flux dans votre condition de boucle. Je préfère cette méthode car vous ne ferez pas une lecture de longueur "0" (condition rare, mais cela peut arriver).

do{
      len = stream.ReadBlock(buffer, 0, buffer.Length);
      /* ... */
  }while(!stream.EndOfStream);
2
The Moof

De MSDN pour ReadBlock():

Type de valeur de retour: System.Int32 La position du flux sous-jacent est avancée par le nombre de caractères lus dans le tampon. Le nombre de caractères lus. Le nombre sera inférieur ou égal à count, selon que tous les caractères saisis ont été lus.

Je suppose donc que c'est EOF quand il renvoie 0,

1
Bala R