Lecture d'entiers à partir d'un fichier texte

Résolu
Amine MAYOUF Messages postés 5 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2012 - 8 mai 2012 à 02:28
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 9 mai 2012 à 10:40
Bonsoir,
je dois lire des entiers un par un a partir d'un fichier texte de n+2 lignes.
(pour les utiliser ensuite dans une structure)
-la première et la deuxième ligne contiennent 2 entiers
-pour les n lignes suivantes je dois lire jusqu'à la fin de la ligne.

J'ai codé ceci (le code fonctionne, mais j'ai besoin d'une façon plus optimale pour effectuer la lecture des entiers):

Graphe *ajoutGrapheTexte(int &s_depart, int &s_arrivee)
{
       char a, b, c, d, stTemp[2];
       int t;
  
       Graphe *G = initGraphe();
       Sommet *S = initSommet();
       Successeur *Su = initSuccesseur();
       
       std::ifstream monFichier("monFichier.txt");
  
       if (!monFichier.is_open()) std::cout << "Impossible d'ouvrir le fichier en lecture !" << std::endl;
       else
       {
         //Lecture de la première ligne:
              
              for(int i(0); i<1; i++)
              {     
                 monFichier >> a >> b;
                 sprintf(stTemp,"%c",a);
                 G->n = atoi(stTemp);
                 sprintf(stTemp,"%c",b);
                 G->m = atoi(stTemp);   
              }
              
              for(int i(1); i<2; i++)
              {     
                 monFichier >> a >> b;
                 
                 sprintf(stTemp,"%c",a);
                 s_depart = atoi(stTemp);
                 
                 sprintf(stTemp,"%c",b);
                 s_arrivee = atoi(stTemp);   
              }  
              
         //Lecture des n lignes restantes:
                     
              for(int i(2); i<G->n+2; i++) 
              {
                 monFichier >> a >> b >> c >> d;
    
                 sprintf(stTemp,"%c",a);
                 t = atoi(stTemp);
                 
                 sprintf(stTemp,"%c",b);
                 Su = ajoutSuccesseur(Su, atoi(stTemp), 1);
                 
                 if(c != '#') //Je n'ai pas trouvé de meilleur façon pour stopper la lecture a la fin de la ligne.
                 {
                      sprintf(stTemp,"%c",c);
                      Su = ajoutSuccesseur(Su, atoi(stTemp), 1);
                      
                      if(d != '#') //idem
                      {
                           sprintf(stTemp,"%c",d);
                           Su = ajoutSuccesseur(Su, atoi(stTemp), 1);
                      }    
                 }
                S = ajoutSommet(S, Su, t);
                if(i 2) G->tete S;
                
                Su = initSuccesseur();   
              }
       }
  
  monFichier.close();
return G;
}


Voici le contenu du fichier texte:

99
04
013#
102#
215#
306#
47##
528#
637#
7468
857#

//Comme vous le voyez je suis obligé d'utiliser # pour arreter la lecture

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 mai 2012 à 13:18
Bonjour.

Je ne sais pas pourquoi tu dois mettre des '#' partout, mais tu peux très bien utiliser "fichier >> entier" directement au lieu de "fichier >> caractère, puis conversion en entier"

Soit le fichier suivant:

99
4
13
102
215
306
47
528
637
7468
857


Pour le lire proprement, j'utiliserais:
#include 
#include <fstream>

void readFile(const std::string& filename)
{
  std::ifstream file(filename.c_str());

  if (!file)
  {
    std::cout << "Impossible d'ouvrir le fichier en lecture !" << std::endl;
    return;
  }

  int t;
  while (file >> t)
    std::cout << t << std::endl;
}

int main()
{
  readFile("monFichier.txt");

  return 0;
}


J'ai retiré la logique de graphe, puisque ici, ton souci se trouve au niveau de la lecture de fichier.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 mai 2012 à 10:40
Tu n'as pas besoin de détecter les sauts de ligne. Le code donné, le fait tout seul.
En revanche, si tu veux vraiment récupérer une ligne d'un fichier, tu as la fonction std::getline (voir la doc sur le net).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
Amine MAYOUF Messages postés 5 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2012
9 mai 2012 à 00:58
Merci pour votre aide!
Encore une question: comment je fais pour détecter un saut de ligne maintenant que la fonction lit directement des entiers ?
0
Rejoignez-nous