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

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

Votre réponse

7 réponses

Meilleure réponse
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
5 novembre 2018
- 22 juin 2010 à 17:51
3
Merci
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]

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
1108
Date d'inscription
mercredi 15 juin 2011
Dernière intervention
10 juillet 2018
- 22 juin 2010 à 17:14
0
Merci
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
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 22 juin 2010 à 17:44
0
Merci
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
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 22 juin 2010 à 18:08
0
Merci
je vous remercie infiniment, enfin le résultat est juste.
Commenter la réponse de cs_mervat
Messages postés
3829
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
5 novembre 2018
- 22 juin 2010 à 18:40
0
Merci
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
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 23 juin 2010 à 10:17
0
Merci
oui effectivement, c vrai ce que vous avez dit, merci encore.
Commenter la réponse de cs_mervat
Messages postés
90
Date d'inscription
samedi 5 juin 2010
Dernière intervention
6 mars 2015
- 23 juin 2010 à 10:24
0
Merci
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.