[C++] Boucle folle
Dernière réponse : dans Programmation
Bonjour,
Le but de mon programme est de tester la présence d'une ligne d'un fichier dans un autre.
Si celle-ci n'existe pas dans le second fichier, je l'écrit dans un troisième fichier.
Apparemment, mon programme ne s'arrête pas à la fin du fichier, d'où une boucle folle qui m'écrit toutes les lignes dans mon troisième fichier.
Toute aide est la bien venue.
PS: J'ai essayer de remplacer les
par
Mais ça ne marche pas.
Le but de mon programme est de tester la présence d'une ligne d'un fichier dans un autre.
Si celle-ci n'existe pas dans le second fichier, je l'écrit dans un troisième fichier.
Apparemment, mon programme ne s'arrête pas à la fin du fichier, d'où une boucle folle qui m'écrit toutes les lignes dans mon troisième fichier.
Toute aide est la bien venue.
PS: J'ai essayer de remplacer les
tabcli[1]==tabcli2[1]
par
(strcmp(tabcli[1], tabcli2[1])=0) ou !strcmp(tabcli[1], tabcli2[1])
Mais ça ne marche pas.
Autres pages sur : boucle folle
Lassé par la pub ? Créez un compte
J'ai modifier mon code, parce qu'il y avait pas mal d'erreur, mais j'ai toujours le même problème.
Donc à votre demande je le poste sur le forum.
Donc à votre demande je le poste sur le forum.
//##########Bibliothèques########## #include<iostream> #include<fstream> #include<io.h> #include<string> #include<cstring> #include<sstream> using namespace std; //##########Types########## typedef char chaine[1000]; std::fstream fic; std::fstream fic2; std::fstream fic3; typedef string tclient[62]; //##########Prototypage########## void decoupage(tclient, chaine); void ecriture(tclient); //##########Programme principal########## void main(void) { bool trouve; int k = 0; int m = 0; tclient tabcli; tclient tabcli2; chaine cli, cli2; int i; fic.open("mmlcomplet.csv",ios::in); if(!fic) { std::cout<<"ouverture mmlcomplet impossible"; } else { if(!fic.eof()) { fic3.open("extraction.csv",ios::out); //ya un problème avec idn c'est "out" normalement if(!fic3) { std::cout<<"ouverture extraction impossible"; } else { do { trouve = false; fic.getline(cli,sizeof(chaine)); decoupage(tabcli, cli); fic2.open("mmlmauvais.csv",ios::in); do { fic2.getline(cli2,sizeof(chaine)); m++; std::cout<<"lecture de l'enregistrement "<<m<<"\n"; decoupage(tabcli2, cli2); if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] && tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7]) { std::cout<<"enregistrement trouvé"<<"\n"; trouve = true; } }while(!fic2.eof()); fic2.close(); if(!trouve) { ecriture(tabcli); k++; std::cout<<k<<" enregistrement écrit!!!!!!!!!!!!!!!!!!!"<<"\n"; } }while(!fic.eof()); fic.close(); fic3.close(); } } else { std::cout<<"mmfcomplet vide"; } } fic.close(); fic2.close(); std::cin>>i; } //##########sous-programmes########## void decoupage(tclient tab, chaine cli) { int i; std::string string1 = cli; std::string string2; for(i=0;i<61;i++) { string2 = string1.substr(0, string1.find(';')); string1 = string1.substr(string1.find(';')+1); tab[i]=string2; //std::cout<<string2; } } void ecriture(tclient tab) { int i; std::string concat = ""; for(i=0;i<57;i++) { concat=concat+tab[i]+';'; } concat=concat+"\n"; //std::cout<<concat; fic3<<concat; }
string cli, cli2; ..... do { trouve = false; getline(fic, cli); decoupage(tabcli, cli); fic2.seekp(0); do { getline(fic2, cli2); m++; std::cout<<"lecture de l'enregistrement "<<m<<"\n"; decoupage(tabcli2, cli2); if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] && tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7]) { std::cout<<"enregistrement trouvé"<<"\n"; trouve = true; break; } }while(!fic2.eof()); if(trouve) { ecriture(tabcli); k++; std::cout<<k<<" enregistrements écrit!!!!!!!!!!!!!!!!!!!"<<"\n"; }
Adapte ton code aux cli1 et 2 qui sont en string, pas besoin de char[1000] qui peut poser probleme si trop court.
Pour la boucle tu oublie de revenir au debut du fichier fic2.
J'ai remis le code plus ou moins comme il était parce que les getline(fic, cli) ne remplissait pas les variables.
Donc je résume, avec ce code :
Je ne sort pas du 2ième "do", et le booléen se met à vrai lorsque que je dépasse le nombre de ligne du fichier.(Le fichier comporte 10390 lignes).
En attente d'une solution...
Donc je résume, avec ce code :
//##########Bibliothèques########## #include<iostream> #include<fstream> #include<io.h> #include<string> #include<cstring> #include<sstream> using namespace std; //##########Types########## typedef char chaine[1000]; std::fstream fic; std::fstream fic2; std::fstream fic3; typedef string tclient[62]; //##########Prototypage########## void decoupage(tclient, string); void ecriture(tclient); //##########Programme principal########## void main(void) { bool trouve; int k = 0; int m = 0; tclient tabcli; tclient tabcli2; chaine cli, cli2; int i; fic.open("mmlcomplet.csv",ios::in); fic2.open("mmlmauvais.csv",ios::in); if(!fic || !fic2) { std::cout<<"ouverture de mmlcomplet ou de mmlmauvais impossible"; } else { if(!fic.eof() || !fic2.eof()) { fic3.open("extraction.csv",ios::out); if(!fic3) { std::cout<<"ouverture extraction impossible"; } else { do { trouve = false; fic.getline(cli, sizeof(chaine)); decoupage(tabcli, cli); fic2.seekp(0); m = 0; do { fic2.getline(cli2, sizeof(chaine)); m++; std::cout<<"lecture de l'enregistrement "<<m<<"\n"; decoupage(tabcli2, cli2); if(tabcli[1] == tabcli2[1] && tabcli[3]==tabcli2[3] && tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7]) { std::cout<<"enregistrement trouvé"<<"\n"; trouve = true; } }while(!fic2.eof() && !trouve); if(!trouve) { ecriture(tabcli); k++; std::cout<<k<<" enregistrement écrit!!!!!!!!!!!!!!!!!!!"<<"\n"; } }while(!fic.eof()); fic.close(); fic2.close(); fic3.close(); } } else { std::cout<<"mmfcomplet ou mmlmauvais vide"; } } fic.close(); fic2.close(); std::cin>>i; } //##########sous-programmes########## void decoupage(tclient tab, string cli) { int i; std::string string1 = cli; std::string string2; for(i=0;i<61;i++) { string2 = string1.substr(0, string1.find(';')); string1 = string1.substr(string1.find(';')+1); tab[i]=string2; //std::cout<<string2; } } void ecriture(tclient tab) { int i; std::string concat = ""; for(i=0;i<57;i++) { concat=concat+tab[i]+';'; } concat=concat+"\n"; //std::cout<<concat; fic3<<concat; }
Je ne sort pas du 2ième "do", et le booléen se met à vrai lorsque que je dépasse le nombre de ligne du fichier.(Le fichier comporte 10390 lignes).
En attente d'une solution...
Pour le getline fallait comme j'avais mis adapter les cli a des string.
Si la ca marche pas, le probleme est ailleurs.
//##########Bibliothèques########## #include<iostream> #include<fstream> #include<ios> #include<string> using namespace std; //##########Types########## std::fstream fic; std::fstream fic2; std::fstream fic3; typedef string tclient[62]; //##########Prototypage########## void decoupage(tclient, string); void ecriture(tclient); void main() { bool trouve; int k = 0; int m = 0; tclient tabcli; tclient tabcli2; string cli, cli2; int i; fic.open("mmlcomplet.csv",ios::in); if(!fic) { std::cout<<"ouverture mmlcomplet impossible"; } else { fic2.open("mmlmauvais.csv",ios::in); if(!fic2) { std::cout<<"ouverture mmlmauvais impossible"; } else { fic3.open("extraction.csv",ios::out); if(!fic3) { std::cout<<"ouverture extraction impossible"; } else { do { trouve = false; getline(fic, cli); if (!cli.length()) continue; decoupage(tabcli, cli); fic2.seekp(0); m = 0; do { getline(fic2, cli2); m++; if (!cli2.length()) continue; decoupage(tabcli2, cli2); if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] && tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7]) { std::cout<<"enregistrement valide trouve ligne Num : "<<m<<std::endl; trouve = true; break; } }while(!fic2.eof()); if(trouve) { ecriture(tabcli); k++; std::cout<<k<<" enregistrements ecrit!"<<std::endl; } //Controle d'avancement dans le fichier1 std::cout<<"Position dans le fichier 1 : "<<fic.tellp()<<std::endl; }while(!fic.eof()); std::cout<<"Sortie Fichier1"<<std::endl; } } } fic.close(); fic2.close(); fic3.close(); std::cin>>i; } //##########sous-programmes########## void decoupage(tclient tab, string cli) { int i; std::string string1 = cli; std::string string2; for(i=0;i<61;i++) { string2 = string1.substr(0, string1.find(';')); string1 = string1.substr(string1.find(';')+1); tab[i]=string2; } } void ecriture(tclient tab) { int i; std::string concat = ""; for(i=0;i<57;i++) { concat += tab[i] + ';'; } concat += "\n"; fic3<<concat; }
Si la ca marche pas, le probleme est ailleurs.
heu... je te donne l'affichage de la console :
...
Position dans la fichier 1 : 2903232
Position dans la fichier 1 : 2904523
...
...
...
Position dans la fichier 1 : 2903232
Sortie fichier1
Voila ça en gros c'est ce qu'affiche la console, avec beaucoup moins de ligne évidemment.
Et le résultat c'est que ça ma ouvert un fichier extraction.csv qui ne contient rien...
Tu peux m'expliquer?
...
Position dans la fichier 1 : 2903232
Position dans la fichier 1 : 2904523
...
...
...
Position dans la fichier 1 : 2903232
Sortie fichier1
Voila ça en gros c'est ce qu'affiche la console, avec beaucoup moins de ligne évidemment.
Et le résultat c'est que ça ma ouvert un fichier extraction.csv qui ne contient rien...
Tu peux m'expliquer?
Citation :
Position dans la fichier 1 : 2903232
Position dans la fichier 1 : 2904523
...
...
...
Position dans la fichier 1 : 2903232
Sortie fichier1
Ca, c'est mathematiquement impossible, si tu regarde l'algo tu comprendra par toi meme qu'a aucun moment tu ne reviens en arriere dans le fichier1, tu ne fais qu'avancer en lecture.
Si tu n'as rien dans le fichier3 c'est que ton if qui doit mettre le booleen a true a trouver false a la condition d'entree a chaque fois.
Essaie de mettre fic3.flush(); avant de faire le fic3.close() mais ca c'est dans le cas d'un compilo buggué.
As tu vraiment fais un copier/coller de ce que j'ai mis?
Avec quoi compiles tu le programme?
J'ai bien fais un copier coller de ce que tu avais mis. Par contre dans l'affichage de la console que je t'ai donné, c'est moi qui me suis trompé...
Mais c'est le genre d'affichage que ça me donne, tout en restant croissant...
Enfin tout pour dir que je ne vois aucun rapport avec le but du programme...
Sinon je compile avec Visual C++ 2005 Express.
Mais c'est le genre d'affichage que ça me donne, tout en restant croissant...
Enfin tout pour dir que je ne vois aucun rapport avec le but du programme...
Sinon je compile avec Visual C++ 2005 Express.
Lassé par la pub ? Créez un compte
- Contenus similaires :
- Solutions[RESOLUT]Ma tour s'eteind et se rallume toute seul en boucle
- ForumSouris instable et folle
- SolutionsLangage C : problème avec boucle
- Solutions[VBA] boucle sur une listview
- SolutionsRebootage en boucle après installation barrette RAM
- SolutionsProbleme boucle While [C/C++]
- Forum[urgent] Explorer.exe a cesser de fonctionner en boucle
- SolutionsSortir d'une boucle ou d'une condition avant la fin
- SolutionsMon ordi redémarre en boucle
- Voir plus