Conversion de fichiers

cs_sergio18 Messages postés 18 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 4 mai 2004 - 20 févr. 2004 à 18:14
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005 - 2 mars 2004 à 14:17
salut
Je fais un projet où je dois faire une conversion du fichier.POur cela le prof qui me suit m'a demandé d'effectuer ds un premier temps une lecture ligne par ligne du fichiers et ensuite de comparer les mots.Pour la lecture ligne par ligne,j'ai utilisé fgets et puisque cette fonction ne rencoie que la premiere ligne du fichier,j'ai fait un boucle jusqu'au nbre de lignes du fichier.Jusque là pas de pb mais ma question est:peut-on retrouver des mots avec fgets pr ensuite les comparer?et sui oui comment?
merci d'avance

vive le c++

12 réponses

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
20 févr. 2004 à 18:36
fgets te renvoie une chaine de caractere ;
reste plus qu'a la comparer avec les fonctions de <string.h> (strcmp par exemple)
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
22 févr. 2004 à 01:34
Non, fgets te renvoie une chaine de caractères comme te le dit hilairenicolas.
Mais avant de faire des strcmp, il faut que tu extrais les mots des lignes que t'as chopé.
Sois tu le fais toi même : tu parcours la chaine de caractères et à chaque espace bah tu passes à un autre mots (ce que je ferais)... sois tu va voir un peu les sscanf mais ça sera sans doute plus long et plus compliqué!

PS : fais gaffe car le fgets prends le caractère '\n' et le mets dans la chaine, contrairement au gets qui le remplace par '\0'.
0
cs_sergio18 Messages postés 18 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 4 mai 2004
24 févr. 2004 à 18:54
Je tiens tout d'abord à vous remercier pr vos reponses et j'avais pensé à cette solution à savoir parcourir la chaine et passer à un autre mot à chaque espace mais je ne sais pas comment le coder en C++.Si vous pouvez m'aider j'en serais très heureux.

vive le c++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
24 févr. 2004 à 19:27
char string[100]; // ou plus
char mot[20];
int posmot, poschaine=0;
fgets(string, taille, fichier);
while((string[poschaine] != '\0') && (string[poschaine] != '\n')) // condition de fin de chaine
{
posmot=0; // pour le premier caractère du mot
while(string[poschaine+posmot] != 0x20) // 0x20 = code hexa de l'espace
{
mot[posmot] = string[poschaine+posmot];
posmot++;
}
// éventuellement, pour fermer la chaine...
mot[posmot] = 0x00;

// et à cet endroit la, tu as un mot!

poschaine++;
}

***********************

j'ai fait ca à la volée sans tester... mais si y a bug, t'as quand meme matiere a...
0

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

Posez votre question
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
24 févr. 2004 à 19:42
euh, fais gaffe, je viens de me rendre compte d'une bourde, le "poschaine++" c'est plutot "poschaine += posmot"!
0
cs_sergio18 Messages postés 18 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 4 mai 2004
24 févr. 2004 à 19:48
ok merci je vais le tester.j'ai une autre question:
toi ds ton fgets tu utilise string qui est un tableau de char.moi g utilisé un char*;ça change quelque chose ou pas?

vive le c++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
24 févr. 2004 à 20:02
regarde mieux la déclaration :

char string[100];

-> c'était pour être plus clair (et c'est raté lol).
le string que j'ai déclaré est un char * ... mais appelle le autrement genre, "ligne" ... sinon ton compilateur risque de ne pas apprécier!
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
24 févr. 2004 à 20:05
Attends... j'ai ptet compris ce que tu voulais dire!
T'utilises un char * ... mais moi aussi...
Tu fais une allocation dynamique ?

tu ne peux pas faire :

char *ligne;
fgets(ligne, taille, fichier);

car la mémoire de ton char * n'a pas été allouée!

quand tu déclares : char ligne[100] , ligne est un char *.
0
cs_sergio18 Messages postés 18 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 4 mai 2004
26 févr. 2004 à 18:24
oui donc c pareil car voici ce que j'ai fait:

char *ligne;
ligne=(char*)malloc(200);
fgets(ligne, taille, fichier);

je pense que c'est juste

vive le c++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
26 févr. 2004 à 18:53
Honnêtement c psa top...

fais juste :

char ligne[200];

et dans ce cas, je t'assure que ligne est de type char* , pas de cast à faire...

d'autre part!

T'aurais du faire :

ligne = (char *)malloc(200 * sizeof(char));

... char faisant 1 octet ça doit être un coup de bol!

D'autre part, si tu fais un malloc, il te faut un free une fois que tu ne te sers plus de ton pointeur! Sinon, t'alloues de la mémoire que tu ne libère jamais!

free(ligne);

*******************

mais fais juste

char ligne[200];
0
cs_sergio18 Messages postés 18 Date d'inscription vendredi 20 février 2004 Statut Membre Dernière intervention 4 mai 2004
2 mars 2004 à 09:01
J'ai testé exactement ce que tu m'as donné mais au lieu d'obtenir un mot je n'obitient que le premier caratère et j'arrive pas à trouver la solution.

vive le c++
0
cs_goondy Messages postés 95 Date d'inscription jeudi 9 octobre 2003 Statut Membre Dernière intervention 7 janvier 2005
2 mars 2004 à 14:17
Oups... j'a gaffé?
Euh, bah lance en debbugger... ca ne doit pas être vilain ;)
Tu sais que ligne[0] ne contient qu'un caractère? Pas un mot!
Le mot est contenu dans ligne (ligne est le pointeur sur la chaine de caractère)...
Aller, en debug avec points d'arrêts tu trouveras le détail qui cloche.
;)
0
Rejoignez-nous