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