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

cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention - 22 juin 2010 à 17:07 - Dernière réponse : cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention
- 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.
Afficher la suite 

7 réponses

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 22 juin 2010 à 17:51
+3
Utile
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]
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
fregolo52 1106 Messages postés mercredi 15 juin 2011Date d'inscription 19 juillet 2016 Dernière intervention - 22 juin 2010 à 17:14
0
Utile
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é.
Commenter la réponse de fregolo52
cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention - 22 juin 2010 à 17:44
0
Utile
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)
Commenter la réponse de cs_mervat
cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention - 22 juin 2010 à 18:08
0
Utile
je vous remercie infiniment, enfin le résultat est juste.
Commenter la réponse de cs_mervat
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscription 18 avril 2018 Dernière intervention - 22 juin 2010 à 18:40
0
Utile
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]
Commenter la réponse de cptpingu
cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention - 23 juin 2010 à 10:17
0
Utile
oui effectivement, c vrai ce que vous avez dit, merci encore.
Commenter la réponse de cs_mervat
cs_mervat 90 Messages postés samedi 5 juin 2010Date d'inscription 6 mars 2015 Dernière intervention - 23 juin 2010 à 10:24
0
Utile
j'ai oublié de vous dire que j'ai ajouté #include <string> car sinon ça me donne une erreur de compilation.
Commenter la réponse de cs_mervat

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.