0
votes

C # Lecture d'une chaîne de fichier texte, fractionnement et mettant en trebring

J'ai été bloqué écrire un programme simple qui écrit des données dans le fichier texte et les lit former ce fichier ultérieurement.

J'ai une fonction qui écrit des lignes à un fichier TXT; Chaque ligne contient le nom, le nom de famille et le numéro d'identification.

et ci-dessous J'ai une fonction qui lit les données de ce fichier.

Je souhaite séparer le nom, le nom de famille et l'IDN audes-ci Semble être correct mais pendant le débogage, j'ai reçu un message "une exception non utilisée du type" System.NullReferenceException "s'est produite" pour cette ligne: chaîne [] tabstring = mystring.split ('' ',' '' '); .

J'ai créé la chaîne d'onglets contenant 3 éléments - chacun pour chaque mot dans la ligne IE Tabstring [0] = nom et ainsi de suite.

Le pendant que boucle est de le faire pour chaque ligne dans le fichier texte. Mais quelque chose ne va pas. xxx

et voici ce que le fichier texte ressemble à: xxx

et ainsi de suite .. .

J'apprécierais vos commentaires sur le problème décrit.


4 commentaires

Juste pour être précis: chaque ligne de fichier texte ne contient que trois mots de mots (espace entre) nom de famille (Spacebetween) Idnumber.


Remarque: le fichier peut avoir des onglets entre les deux et ceci est considéré comme un caractère différent. Mieux poster le contenu du fichier tel quel


Est-ce que cela répond à votre question? Qu'est-ce qu'une nullreferenceExceptionException, et comment puis-je le réparer?


Non, le fichier n'est pas un onglets entre car il est créé par fonction, il n'y a qu'un espace entre chaque mot,


3 Réponses :


0
votes

Votre problème est ici:

var myString = srListOfObjects.ReadLine();

while (myString != null)
{
    //do your stuff
    myString = srListOfObjects.ReadLine();
}


1 commentaires

Oui ! Exactement votre numéro 2 décrit exactement ce que j'ai obtenu - les résultats ne contiennent que chaque deuxième ligne NAD, puis le programme écrase. Alors quelle est la solution alors? Devrais-je insérer des chèques par "si" qui vérifiez si la ligne n'est en fait pas null, puis on peut attribuer à la chaîne ma chaîne ??



0
votes

HTTPS: / /docs.microsoft.com/en-us/dotnet/api/system.io.streamreader.readline?View=netcore-3.1

readline () - Lit une ligne de caractères du flux en cours et renvoie les données sous forme de chaîne.

Dans votre code, vous faites une vérification nulle, mais appelez à nouveau readline. Lorsque vous avez touché la dernière ligne, vous obtiendrez une chaîne nulle et la fractionnement qui échouera avec la référence NULL


7 commentaires

Comme @inbetween pointe, vous progressez également après votre première ligne sans le traiter


Tout est vrai, mais la boucle pendant que vous devriez s'arrêter une fois qu'elle devient à une ligne quématique qui signifie à la fin du fichier ainsi la chaîne mystring = (SrlistofObject.readline (); ne doit pas être exécuté, n'est-ce pas?


@ kalka79 no. Votre fichier a une seule ligne. À l'intérieur de la condition de boucle WILE, votre ligne Lire une ligne, et ce n'est pas null. Vous entrez dans le corps de la boucle. Maintenant, vous lisez une nouvelle ligne et vous le stockez dans mystring . Mais le fichier n'a qu'une ligne, donc le nouvel appel de lecture de ligne de lecture null et mystring est donc null . Vous écrivez ensuite mystring à la console. Écriture null à la console n'est pas une erreur, il imprimera simplement la même chose que console.writeline () . Vous essayez ensuite d'acéder un membre d'instance de mystring appelant .split et il y a lieu où votre programme se bloque.


Ce fichier contient quelques lignes non une. Mais la ligne qui est à l'intérieur de la condition de boucle tandis que la même ligne est la même ligne qui est stockée dans la mystring droite?


@ kalka79 Peu importe, il va s'écraser si le nombre total de lignes est un nombre impair. Si le nombre total de lignes est un nombre pair, il ne s'agira pas qui est pire parce que vous penserez que sa fonctionne fonctionne bien et ce n'est vraiment pas; Vous perdez 50% des informations que vous essayez de traiter.


Oui, je viens de remarquer que si j'ai plus de lignes dans le dossier, j'ai eu quelque chose comme chaque deuxième ligne de sortie - mais je ne peux toujours pas comprendre pourquoi?


@ kalka79 voir ma réponse. Comptez combien de fois vous appelez readline par cycle de boucle et comparez-le au nombre de fois que vous devez l'appeler. Si vous souhaitez traiter une ligne par boucle, vous devez appeler readline une seule fois, mais vous l'appelez deux fois ...



0
votes

tandis que (srlistofobject.readline () .. / code> lit une ligne mais ne l'enregistrez pas dans une variable. string mystring = (srlistofObject.readline ()) lit une autre ligne .

Utilisez tandis que (! SrlistofObject.undofstream) Pour vérifier la fin du flux: Propriété de StreamReader.ENDOfstream .

Aussi est une bonne idée de vérifier que le nombre correct de parties de la chaîne a été obtenu par la scission - il protège contre des lignes telles que des lignes avec uniquement des espaces blanche.

Des choses comme des rationadistes ont besoin de .Dispose () Pour effacer les "ressources non gérées" - un moyen facile de faire ce qui fonctionnera même si le programme se bloque pour utiliser le à l'aide de déclaration.

Si vous faites le si vous faites le LIVEFOMFILE Méthode dans une fonction au lieu d'un vide, vous pouvez éviter (aucun jeu de mots) à l'aide d'une variable globale pour les données. Les variables globales ne sont pas nécessairement un problème, mais il est généralement bon de les éviter. xxx

sorties:

1233456789 - Brown, Ann
98987875 - Willis, Bruce
789678678 - Gates, facture


1 commentaires

Qui est accordé! Code joliment écrit et utile. Merci !