Amine MAYOUF
Messages postés5Date d'inscriptionmardi 29 novembre 2011StatutMembreDernière intervention 9 mai 2012
-
8 mai 2012 à 02:28
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 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;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question