Comparer les mots d'un fichier texte aux éléments d'une liste chaînée (c++)

Résolu
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015 - 22 juin 2010 à 17:07
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015 - 23 juin 2010 à 10:24
ce programme permet de créer une liste de mots à partir d'un fichier texte"in1" et puis éliminer les mots qui existent dans la liste du fichier texte "in" et mettre le résultat dans un autre fichier texte appelé "out".

#pragma argsused
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h> /*ou alloc.h*/
#include <string>
#include 
#include <fstream>
using std::ifstream;
using std::ofstream;
using std::string;
struct page {string val; struct page *suivant; };
struct page *premier;

void creerliste(void)// créer une liste de mots à partir d'un fichier texte
{ ifstream entree ("in1.txt");
string i;
struct page *precedent,*nouveau;
premier=(struct page *)malloc(sizeof(struct page));
entree >> premier->val;
precedent=premier;
while (entree >> i)
{
nouveau=(struct page *)malloc(sizeof(struct page));
precedent->suivant=nouveau;
precedent=nouveau;
nouveau->val =i;
}
precedent->suivant=NULL;
}

 void compare(struct page *debut)// éliminer les mots qui existent dans la liste du fichier texte et mettre le résultat dans un autre fichier texte
{  int i=0;
ifstream ifs  ("in.txt") ;
ofstream ofs ("out.txt");
string s;
while (ifs >> s)
{  while(debut!=NULL)
   {if (s == debut->val)
i=1; break;
debut=debut->suivant;
   }
if (i==1)    ofs << ""; //ne pas réécrire le mot dans le nouveau fichier
else  ofs << s << " "; //réécrire le mot dans le nouveau fichier

i=0;
}
}

int main(int argc, char* argv[])
{
creerliste();
compare(premier);
system("PAUSE");
return 0; 
}

le programme est exécutable
la procédure creerliste est juste mais la procédure compare me donne un faux résultat .
pourrais-je avoir votre aide svp.

7 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
22 juin 2010 à 17:51
Plusieurs remarques:
- Évite les conio.h si tu n'en as pas besoin tu perds en portabilité pour rien.
- Pas besoin d'include spécifique au C (tous les trucs en .h), en C++.
- <string> est déjà dans .
- est à proscrire ! Utilise toujours
- En C++ une classe et une structure, c'est la même chose ! Donc pas besoin de réecrire "struct" partout. De plus, tu peux faire un new, plutôt qu'un malloc.
- Évite les variables globales.
- Évite NULL, préfère 0, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp

Ton problème était que tu ne repartais pas du début de la liste d'exclusion quand tu cherchais ce qu'il fallait éliminer. J'ai donc ajouter un "head debut" pour sauvegarder la tête de la liste, puis je remet cette liste au début à chaque tour de vérification (debut head).

A noter que je n'ai pas corrigé les erreurs de fuites de mémoires (rien n'est libéré !). Pense à faire une procédure de libération (avec le mot clé delete).
#include 
#include <fstream>

using std::ifstream;
using std::ofstream;
using std::string;

struct Page
{
  string val;
  Page* suivant;
};

// créer une liste de mots à partir d'un fichier texte
Page* creerliste()
{
  ifstream entree ("in1.txt");
  string i;
  Page* premier;
  Page* precedent;
  Page* nouveau;

  premier = new Page;
  entree >> premier->val;
  precedent = premier;
  while (entree >> i)
  {
    nouveau = new Page;
    precedent->suivant = nouveau;
    precedent = nouveau;
    nouveau->val = i;
  }
  precedent->suivant = 0;

  return premier;
}

void compare(Page* debut)
{
  int i = 0;
  ifstream ifs("in.txt") ;
  ofstream ofs("out.txt");
  string s;
  Page* head = debut;

  while (ifs >> s)
  {
    debut = head;
    while (debut != 0)
    {
      if (s == debut->val)
      {
i = 1;
break;
      }
      debut = debut->suivant;
    }
    if (i == 1)
      ofs << ""; //ne pas réécrire le mot dans le nouveau fichier
    else
      ofs << s << " "; //réécrire le mot dans le nouveau fichier
    i = 0;
  }
}

int main()
{
  Page* premier = creerliste();
  compare(premier);

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
22 juin 2010 à 17:14
commence par mettre des accolades dans tes blocs if et while !!!
et 1 ligne par instruction, et tu verras que ton programme "break" en permanence et donc debut=debut->suivant; n'est jamais exécuté.
0
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
22 juin 2010 à 17:44
oui c vrai ce que vous avez dit, alors si mon code devient:
void compare(struct page *debut)
{  int i=0;
ifstream ifs  ("in.txt") ;
ofstream ofs ("out.txt");
string s;
while (ifs >> s)
   {  while(debut!=NULL)
{if (s == debut->val)
   {i=1;
    break;}

 debut=debut->suivant;
}
if (i==1)    ofs << "";
else  ofs << s << " ";

i=0;
   }

}

ça me donne aussi un faux résultat (il me réécrit tous les mots du fichier "in" dans le nouveau fichier "out" sans éliminer les mots de la liste)
0
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
22 juin 2010 à 18:08
je vous remercie infiniment, enfin le résultat est juste.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
22 juin 2010 à 18:40
En passant, ceci:
    if (i == 1)
      ofs << ""; //ne pas réécrire le mot dans le nouveau fichier
    else
      ofs << s << " "; //réécrire le mot dans le nouveau fichier

peut être amélioré en:
    if (i != 1)
      ofs << s << " "; //réécrire le mot dans le nouveau fichier


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
23 juin 2010 à 10:17
oui effectivement, c vrai ce que vous avez dit, merci encore.
0
cs_mervat Messages postés 90 Date d'inscription samedi 5 juin 2010 Statut Membre Dernière intervention 6 mars 2015
23 juin 2010 à 10:24
j'ai oublié de vous dire que j'ai ajouté #include <string> car sinon ça me donne une erreur de compilation.
0
Rejoignez-nous