J'essaie de lire un fichier .txt avec StreamReader, Split Lines et ajoutez-les à un dictionnaire, mais quand je le débogé, cela ne fonctionne pas car la première ligne est null et cela ne va pas plus loin. Comment définir la chaîne de la chaîne pour qu'il fonctionne?
StreamReader sr = new StreamReader(@"N:\Desktop\krew.txt"); StreamWriter sw = new StreamWriter(@"N:\Desktop\newKrew.txt"); Dictionary<string, string> dict = new Dictionary<string, string>(); string fullLine = ""; while (fullLine != null) { fullLine = sr.ReadLine(); string[] wholeLine = fullLine.Split('\t'); dict.Add(wholeLine[0], wholeLine[1]);
6 Réponses :
Vous pouvez essayer linq em> et let .net ouverte (et pour ajouter dans Dictionnaire em> existant: p> si vous em> insister em> Sur Disposer code>)
flux code> S,
lecteur code> s pour Vous
StreamReder code>, vous pouvez implémenter un simple
pour code> boucle: p>
Vous feriez mieux d'écrire la boucle comme ceci: Comme vous avez écrit la boucle en ce moment, Je soupçonne que c'est ce que tu veux dire quand tu veux Dites FullLine code> deviendra NULL à la fin de le fichier, puis le
FullLine.split ('\ t'); code> lancera un
NullReferenceException code>. p>
première ligne est null et cela ne va pas plus loin code>. Il ne peut pas réellement être la ligne première em> causer le problème, puisque vous initiez
FullLine code> à "", mais je pense que c'est la question sous-jacente. P> p>
Un .txt ne peut pas avoir de vraies valeurs «null» entre les lignes. Corrigez-moi si je me trompe mais ne sont-ils pas lus en as / n avec StreamReader?
@xtwistedx: fichier ne peut pas avoir null code> lignes mais vide i>
"" code>
@xtwistedx comme La documentation pour streamreader.readline () code>
états: La valeur renvoyée est NULL si la fin du flux d'entrée est atteinte code>, voilà comment la boucle détecte la condition EOF .
Utilisez la méthode .Pek () dans votre boucle tandis que vous pouvez lire à la fin du fichier. Il devrait dépasser votre première ligne est vide.
null n'est pas la même chose que "" p> li>
Peek () Vérifiera le caractère suivant et la ligne est
vide code> il retournera
"" code>. P>. li>
Si vous avez des lignes sur la ligne 2 à X à x, les lignes vides ne sont pas nulles, donc .Pek () retournera -1. Découvrez la documentation sur elle. P> li> ul> blockQuote>
.Peek () https://docs.microsoft.com/en-us/dotnet/api/system.io.streeamreader.peek?view=netFramework-4.8 p>
//Doing it in a Using statement to properly dispose of the StreamReader using (StreamReader sr = new StreamReader(path)) { while (sr.Peek() > -1) { Console.WriteLine(sr.ReadLine()); } }
Changer votre code comme celui-ci
while ((fullLine = sr.ReadLine()) != null) { string[] wholeLine = fullLine.Split('\t'); dict.Add(wholeLine[0], wholeLine[1]); }
Essayez d'utiliser le ci-dessous. Ceci définit la variable de ligne à chaque ligne du fichier
Pourquoi ce travail ne fonctionne-t-il pas avec l'attribution de FullLine = Sr.Readline (); et fait sans elle?
@Wurfv_ Vous devez affecter la variable à l'intérieur de la condition de boucle tandis que. De cette façon, il l'établit avant qu'il ne vérifie s'il est null
Si vous n'êtes pas entièrement em> dépendant de avoir em> utiliser streamreader ..
Euh, comment
FullLine code pourrait-il être NULL à la première exécution? Vous l'avez défini sur une chaîne vide la ligne précédente, qui n'est pas null.
readline () code> renvoie NULL uniquement lorsqu'il atteint la fin du fichier. Votre fichier est content et vous n'avez pas typographique le chemin? Votre programme est en mesure d'accéder à votre lettre de lecteur différente?
Il pourrait simplement être plus facile d'utiliser
fichier.readalllines (..) code> au lieu d'un streamrireder
Et si vous avez l'intention de continuer à utiliser StreamReder, jetez un coup d'œil à la Microsoft Exemple , qui utilise un
en utilisant code>.