Lecture d'entiers à partir d'un fichier texte [Résolu]

Signaler
Messages postés
5
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2012
-
Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
-
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

Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
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
Messages postés
3838
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
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
Messages postés
5
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2012

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 ?