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.
while(!streamReader.EndOfStream)
{
string line = streamReader.ReadLine();
Console.WriteLine(line);
}
Console.WriteLine("End of File");
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.
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
.
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);
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,