2009-12-11 6 views
0

J'ai une fonction comme ceci:C# entrée de fichier de fichier texte

List<float> myList = new List(float); 

    public void numbers(string filename) 
    { 
     string input; 
     float number; 

     if (System.IO.File.Exists(filename) == true) 
     { 
      System.IO.StreamReader objectReader; 
      objectReader = new System.IO.StreamReader(filename); 

      while ((input = objectReader.ReadLine()) != null) 
      { 
       number = Convert.ToSingle(input); 
       myList.Add(number); 
      } 
      objectReader.Close(); 
     } 
     else 
     { 
      MessageBox.Show("No Such File" + filename); 
     } 
    } 

Où Im essayant d'ajouter des numéros (flotteurs) à partir d'un fichier texte dans une liste. Mais je continue d'obtenir des erreurs en disant mauvais format. Les nombres dans le fichier texte sont un nombre par ligne ... toute aide?

+0

peut vous poster un extrait de votre fichier texte. Il pourrait y avoir quelques mauvais caractères dedans. Selon msdn, ReadLine ne renvoie pas le retour chariot, saut de ligne. –

Répondre

3

Votre code a bien fonctionné pour moi, sauf pour le cas de une nouvelle ligne (et bien sûr pour les entrées qui n'étaient pas des numéros du tout)

Voici une version qui devrait fonctionner pour vous, en utilisant un tryParse pour vérifier si chaque ligne peut convertir en un seul:Comme Mike C le signale à juste titre, cela pourrait être risqué - en avalant de bonnes données qui ont été corrompues par le processus de sortie. La méthode tryParse retourne false quand elle échoue afin que vous puissiez ajouter dans une autre branche et une connexion pour vérifier ce qui cause les échecs et voir s'il y a un autre bug qui peut être corrigé.

+0

ouais cela a semblé fonctionner, merci –

+0

Oui, mais qu'est-ce que tu laisses de côté? Les espaces? Caractères alpha? Peut-être est-ce un signe de quelque chose d'incorrect dans n'importe quel processus qui génère le fichier source.Êtes-vous sûr de vouloir exclure aveuglément tout ce qui n'est pas un nombre? Pour moi, cela revient à avaler une exception. –

+0

@Mike C très vrai commentaire. J'ai ajouté un peu à ma réponse en parlant de ça. –

0

Avez-vous des lignes vides dans le fichier ou des échecs pour convertir le numéro? Ma conjecture est que vous avez une ligne qui ne peut pas être convertie pour flotter à partir de son format actuel. Vous devriez vous assurer de nettoyer les lignes avant de les lire (enlever tout ce qui n'est pas un nombre en utilisant une regex) et jeter la ligne si elle échoue la vérification.

Une chose que vous pourriez faire est d'utiliser double à la place et faire un Convert.ToDouble().

0

Y a-t-il des espaces ou des virgules ou quoi que ce soit? La meilleure chose à faire serait de mettre un point d'arrêt sur

number = Convert.ToSingle(input); 

pour voir ce que l'entrée est en fait avant d'essayer de le convertir.

+0

dit l'entrée est: "0" –

+0

Que se passe-t-il si vous appuyez sur F5? Est-ce qu'il échoue immédiatement, ou est-ce que vous atteignez le même point d'arrêt? –

+0

Peut-être que vous devriez définir un critère de point d'arrêt pour aider. –

4

Je vous suggère de faire un appel garniture comme celui-ci

number = Convert.ToSingle(input.Trim()); 

Cependant, un meilleur code serait d'utiliser un appel TryParse

float tmp; 
if(float.TryParse(input.Trim(), out tmp) 
{ 
    mylist.Add(tmp); 
} 
+0

+1. J'ai volé la réponse que je tapais :-) – devstuff

+0

+1 Bien que tryParse (apparaisse) pour fonctionner heureusement sans le .trim() –

0

Il existe un paquet gratuit merveilleux appelé FileHelpers qui aide à importer des données de toutes sortes de fichiers texte. L'avantage avec ceci est qu'une grande partie de la gestion des erreurs plus profondes est déjà en place.

0

Par ailleurs, si (System.IO.File.Exists (nom de fichier) == true) peut être raccourci à si (System.IO.File.Exists (nom de fichier))

Questions connexes