Tom's Guide > Forum > Programmation > [C++] Boucle folle
[C++] Boucle folle - Programmation
TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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

Code :
  1. tabcli[1]==tabcli2[1]



par

Code :
  1. (strcmp(tabcli[1], tabcli2[1])=0)
  2. ou
  3. !strcmp(tabcli[1], tabcli2[1])




Mais ça ne marche pas.

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

salut c'est peut etre que tu a mal mis les conditions de ta boucle.
si elle tourne a l'infinie.
qu'est ce que tu as ecrit comme conditions dans ta boucle et laquelle a tu prise (tant que, pour, répeter jusqu'a)

Répondre à didinux

ton code est pratiquement illisible il n'y a pas de mise en forme, poste le plutot sur le forum avec la balise Code

Répondre à MythTitans

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.

Code :
  1. //##########Bibliothèques##########
  2. #include<iostream>
  3. #include<fstream>
  4. #include<io.h>
  5. #include<string>
  6. #include<cstring>
  7. #include<sstream>
  8. using namespace std;
  9. //##########Types##########
  10. typedef char chaine[1000];
  11. std::fstream fic;
  12. std::fstream fic2;
  13. std::fstream fic3;
  14. typedef string tclient[62];
  15. //##########Prototypage##########
  16. void decoupage(tclient, chaine);
  17. void ecriture(tclient);
  18. //##########Programme principal##########
  19. void main(void)
  20. {
  21.     bool trouve;
  22.     int k = 0;
  23.     int m = 0;
  24.     tclient tabcli;
  25.     tclient tabcli2;
  26.     chaine cli, cli2;
  27.     int i;
  28.     fic.open("mmlcomplet.csv",ios::in);
  29.     if(!fic)
  30.     {
  31.         std::cout<<"ouverture mmlcomplet impossible";
  32.     }
  33.     else
  34.     {
  35.         if(!fic.eof())
  36.         {
  37.             fic3.open("extraction.csv",ios::out);
  38. //ya un problème avec idn  c'est "out"  normalement
  39.             if(!fic3)
  40.             {
  41.                 std::cout<<"ouverture extraction impossible";
  42.             }
  43.             else
  44.             {
  45.                 do
  46.                 {
  47.                     trouve = false;
  48.                     fic.getline(cli,sizeof(chaine));
  49.                     decoupage(tabcli, cli);
  50.                     fic2.open("mmlmauvais.csv",ios::in);
  51.                     do
  52.                     {
  53.                             fic2.getline(cli2,sizeof(chaine));
  54.                             m++;
  55.                             std::cout<<"lecture de l'enregistrement "<<m<<"\n";
  56.                             decoupage(tabcli2, cli2);
  57.                             if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] &&
  58.                                   tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7])
  59.                             {
  60.                                 std::cout<<"enregistrement trouvé"<<"\n";
  61.                                 trouve = true;
  62.                             }
  63.                     }while(!fic2.eof());
  64.                     fic2.close();
  65.                     if(!trouve)
  66.                     {
  67.                         ecriture(tabcli);
  68.                         k++;
  69.                         std::cout<<k<<" enregistrement écrit!!!!!!!!!!!!!!!!!!!"<<"\n";
  70.                     }
  71.                 }while(!fic.eof());
  72.                 fic.close();
  73.                 fic3.close();
  74.             }
  75.         }
  76.         else
  77.         {
  78.             std::cout<<"mmfcomplet vide";
  79.         }
  80.     }
  81.     fic.close();
  82.     fic2.close();
  83.     std::cin>>i;
  84. }
  85. //##########sous-programmes##########
  86. void decoupage(tclient tab, chaine cli)
  87. {
  88.     int i;
  89.     std::string string1 = cli;
  90.     std::string string2;
  91.     for(i=0;i<61;i++)
  92.     {
  93.         string2 = string1.substr(0, string1.find(';'));
  94.         string1 = string1.substr(string1.find(';')+1);
  95.         tab[i]=string2;
  96.         //std::cout<<string2;
  97.     }
  98. }
  99. void ecriture(tclient tab)
  100. {
  101.     int i;
  102.     std::string concat = "";
  103.     for(i=0;i<57;i++)
  104.     {
  105.         concat=concat+tab[i]+';';
  106.     }
  107.     concat=concat+"\n";
  108.     //std::cout<<concat;
  109.     fic3<<concat;
  110. }





Répondre à defjamaica
- 0 +

Code :
  1. string cli, cli2;
  2. .....
  3. do
  4. {
  5.     trouve = false;
  6.     getline(fic, cli);
  7.     decoupage(tabcli, cli);
  8.     fic2.seekp(0);
  9.     do
  10.     {
  11.             getline(fic2, cli2);
  12.             m++;
  13.             std::cout<<"lecture de l'enregistrement "<<m<<"\n";
  14.             decoupage(tabcli2, cli2);
  15.             if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] && tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7])
  16.             {
  17.                 std::cout<<"enregistrement trouvé"<<"\n";
  18.                 trouve = true;
  19.                 break;
  20.             }
  21.     }while(!fic2.eof());
  22.     if(trouve)
  23.     {
  24.         ecriture(tabcli);
  25.         k++;
  26.         std::cout<<k<<" enregistrements écrit!!!!!!!!!!!!!!!!!!!"<<"\n";
  27.     }



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.

Répondre à Noxk

Et tu fais comment pour revenir au début de ton fichier??

Répondre à defjamaica
- 0 +

Code :
  1. fic2.seekp(0);



il est dans le code au dessus

Répondre à Noxk

Apparemment le programme ne sort jamais du 2ième "do", de plus je crois qu'il ne va jamais dans le "if".

Répondre à defjamaica
- 0 +

Le code que je t'ai mis au dessus fonctionne chez moi.

Répondre à Noxk

J'ai mis exactement le code que tu m'as donné, mais je ne sort toujours pas du "do" et je ne pense rentrer dans le "if".

Répondre à defjamaica

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 :

Code :
  1. //##########Bibliothèques##########
  2. #include<iostream>
  3. #include<fstream>
  4. #include<io.h>
  5. #include<string>
  6. #include<cstring>
  7. #include<sstream>
  8. using namespace std;
  9. //##########Types##########
  10. typedef char chaine[1000];
  11. std::fstream fic;
  12. std::fstream fic2;
  13. std::fstream fic3;
  14. typedef string tclient[62];
  15. //##########Prototypage##########
  16. void decoupage(tclient, string);
  17. void ecriture(tclient);
  18. //##########Programme principal##########
  19. void main(void)
  20. {
  21.     bool trouve;
  22.     int k = 0;
  23.     int m = 0;
  24.     tclient tabcli;
  25.     tclient tabcli2;
  26.     chaine cli, cli2;
  27.     int i;
  28.     fic.open("mmlcomplet.csv",ios::in);
  29.     fic2.open("mmlmauvais.csv",ios::in);
  30.     if(!fic || !fic2)
  31.     {
  32.         std::cout<<"ouverture de mmlcomplet ou de mmlmauvais impossible";
  33.     }
  34.     else
  35.     {
  36.         if(!fic.eof() || !fic2.eof())
  37.         {
  38.             fic3.open("extraction.csv",ios::out);
  39.             if(!fic3)
  40.             {
  41.                 std::cout<<"ouverture extraction impossible";
  42.             }
  43.             else
  44.             {
  45.                 do
  46.                 {
  47.                     trouve = false;
  48.                     fic.getline(cli, sizeof(chaine));
  49.                     decoupage(tabcli, cli);
  50.                     fic2.seekp(0);
  51.                     m = 0;
  52.                     do
  53.                     {
  54.                             fic2.getline(cli2, sizeof(chaine));
  55.                             m++;
  56.                             std::cout<<"lecture de l'enregistrement "<<m<<"\n";
  57.                             decoupage(tabcli2, cli2);
  58.                             if(tabcli[1] == tabcli2[1] && tabcli[3]==tabcli2[3] &&
  59.                                   tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7])
  60.                             {
  61.                                 std::cout<<"enregistrement trouvé"<<"\n";
  62.                                 trouve = true;
  63.                             }
  64.                     }while(!fic2.eof() && !trouve);
  65.                     if(!trouve)
  66.                     {
  67.                         ecriture(tabcli);
  68.                         k++;
  69.                         std::cout<<k<<" enregistrement écrit!!!!!!!!!!!!!!!!!!!"<<"\n";
  70.                     }
  71.                 }while(!fic.eof());
  72.                 fic.close();
  73.                 fic2.close();
  74.                 fic3.close();
  75.             }
  76.         }
  77.         else
  78.         {
  79.             std::cout<<"mmfcomplet ou mmlmauvais vide";
  80.         }
  81.     }
  82.     fic.close();
  83.     fic2.close();
  84.     std::cin>>i;
  85. }
  86. //##########sous-programmes##########
  87. void decoupage(tclient tab, string cli)
  88. {
  89.     int i;
  90.     std::string string1 = cli;
  91.     std::string string2;
  92.     for(i=0;i<61;i++)
  93.     {
  94.         string2 = string1.substr(0, string1.find(';'));
  95.         string1 = string1.substr(string1.find(';')+1);
  96.         tab[i]=string2;
  97.         //std::cout<<string2;
  98.     }
  99. }
  100. void ecriture(tclient tab)
  101. {
  102.     int i;
  103.     std::string concat = "";
  104.     for(i=0;i<57;i++)
  105.     {
  106.         concat=concat+tab[i]+';';
  107.     }
  108.     concat=concat+"\n";
  109.     //std::cout<<concat;
  110.     fic3<<concat;
  111. }



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...



Répondre à defjamaica
- 0 +

Pour le getline fallait comme j'avais mis adapter les cli a des string.

Code :
  1. //##########Bibliothèques##########
  2. #include<iostream>
  3. #include<fstream>
  4. #include<ios>
  5. #include<string>
  6. using namespace std;
  7. //##########Types##########
  8. std::fstream fic;
  9. std::fstream fic2;
  10. std::fstream fic3;
  11. typedef string tclient[62];
  12. //##########Prototypage##########
  13. void decoupage(tclient, string);
  14. void ecriture(tclient);
  15. void main()
  16. {
  17.     bool trouve;
  18.     int k = 0;
  19.     int m = 0;
  20.     tclient tabcli;
  21.     tclient tabcli2;
  22.     string cli, cli2;
  23.     int i;
  24.     fic.open("mmlcomplet.csv",ios::in);
  25.     if(!fic)
  26.     {
  27.         std::cout<<"ouverture mmlcomplet impossible";
  28.     }
  29.     else
  30.     {
  31.         fic2.open("mmlmauvais.csv",ios::in);
  32.         if(!fic2)
  33.         {
  34.             std::cout<<"ouverture mmlmauvais impossible";
  35.         }
  36.         else
  37.         {
  38.             fic3.open("extraction.csv",ios::out);
  39.             if(!fic3)
  40.             {
  41.                 std::cout<<"ouverture extraction impossible";
  42.             }
  43.             else
  44.             {
  45.                 do
  46.                 {
  47.                     trouve = false;
  48.                     getline(fic, cli);
  49.                     if (!cli.length())
  50.                         continue;
  51.                     decoupage(tabcli, cli);
  52.                     fic2.seekp(0);
  53.                     m = 0;
  54.                     do
  55.                     {
  56.                         getline(fic2, cli2);
  57.                         m++;
  58.                         if (!cli2.length())
  59.                             continue;
  60.                         decoupage(tabcli2, cli2);
  61.                         if(tabcli[1]==tabcli2[1] && tabcli[3]==tabcli2[3] &&
  62.                             tabcli[6]==tabcli2[6] && tabcli[7]==tabcli2[7])
  63.                         {
  64.                             std::cout<<"enregistrement valide trouve ligne Num : "<<m<<std::endl;
  65.                             trouve = true;
  66.                             break;
  67.                         }
  68.                     }while(!fic2.eof());
  69.                     if(trouve)
  70.                     {
  71.                         ecriture(tabcli);
  72.                         k++;
  73.                         std::cout<<k<<" enregistrements ecrit!"<<std::endl;
  74.                     }
  75.                     //Controle d'avancement dans le fichier1
  76.                     std::cout<<"Position dans le fichier 1 : "<<fic.tellp()<<std::endl;
  77.                 }while(!fic.eof());
  78.                 std::cout<<"Sortie Fichier1"<<std::endl;
  79.             }
  80.         }
  81.     }
  82.     fic.close();
  83.     fic2.close();
  84.     fic3.close();
  85.     std::cin>>i;
  86. }
  87. //##########sous-programmes##########
  88. void decoupage(tclient tab, string cli)
  89. {
  90.     int i;
  91.     std::string string1 = cli;
  92.     std::string string2;
  93.     for(i=0;i<61;i++)
  94.     {
  95.         string2 = string1.substr(0, string1.find(';'));
  96.         string1 = string1.substr(string1.find(';')+1);
  97.         tab[i]=string2;
  98.     }
  99. }
  100. void ecriture(tclient tab)
  101. {
  102.     int i;
  103.     std::string concat = "";
  104.     for(i=0;i<57;i++)
  105.     {
  106.         concat += tab[i] + ';';
  107.     }
  108.     concat += "\n";
  109.     fic3<<concat;
  110. }




Si la ca marche pas, le probleme est ailleurs.

Répondre à Noxk

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?

Répondre à defjamaica
- 0 +

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?

Répondre à Noxk

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.

Répondre à defjamaica

Le programme ne marche toujours pas, mais finalement je n'en ai plus besoin.
Merci à tous pour cotre aide.

Répondre à defjamaica
Tom's Guide > Forum > Programmation > [C++] Boucle folle
Aller à :

Il y a 1942 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens