[FICHIER EN C]
abaze
-
Cal -
Cal -
Bonjour,
j'essaye de trouver un moyen pour effectuer une recherche de mot sur n'importe quel fichier (texte).
J'ai donc décidé d'utiliser les listes chainées mais je n'arrive pas à comprendre comment faire pour:
-recupérer mot par mot du fichier
-inserer chaque mot récuperer dans la liste chainée
J'aimerais savoir s'il existe une fonction qui permettrait de recuperer directement un mot du fichier (et non un caractere).
Merci d'avance.
j'essaye de trouver un moyen pour effectuer une recherche de mot sur n'importe quel fichier (texte).
J'ai donc décidé d'utiliser les listes chainées mais je n'arrive pas à comprendre comment faire pour:
-recupérer mot par mot du fichier
-inserer chaque mot récuperer dans la liste chainée
J'aimerais savoir s'il existe une fonction qui permettrait de recuperer directement un mot du fichier (et non un caractere).
Merci d'avance.
A voir également:
- [FICHIER EN C]
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
9 réponses
bonjour,
dans les librairies de base, il y a :
-fscanf, qui lit jusqu'à retour chariot ou espace ponctuation ou fin de
fichier
-fgets qui lit tout jusq'au prochain retour chariot.
-fgetc qui ne lit qu'un caractère,
-fread qui lit un nombre d'octets connus à l'avance pour le stocker
dans un espace comme struct par exemple
tout le reste, il faut le faire soi même, à moins de trouver une librairie
de traitement de chaines de caratères en C, ou de faire du C++
cordialement
dans les librairies de base, il y a :
-fscanf, qui lit jusqu'à retour chariot ou espace ponctuation ou fin de
fichier
-fgets qui lit tout jusq'au prochain retour chariot.
-fgetc qui ne lit qu'un caractère,
-fread qui lit un nombre d'octets connus à l'avance pour le stocker
dans un espace comme struct par exemple
tout le reste, il faut le faire soi même, à moins de trouver une librairie
de traitement de chaines de caratères en C, ou de faire du C++
cordialement
T'es à quel niveau en C ?
Si tu sais faire des liste chainée, tres simple :
voici l'algo en gros pour faire ton truc :
admettons que tu a une structure mot et lettre que tu défini plus haut bien sur et du type suivant :
typedef struct lettreMaillon {
char * car;
struct lettreMaillon *prochaineLettre;
struct lettreMaillon *lettrePrecedante;
};
// double liste chainée de mot : chaque mot étant constitué d'une double liste chainée de lettre 'lettreMaillon':
typedef struc motMaillon {
struct lettreMaillon *premiereLettreDuMot;
struct motMaillon *prochainMot;
struct motMaillon *motPrecedent;
};
int main () {
struct motMaillon *listeMot = null;
struct motMaillon *courant = null;
char *malettre = null;
// Tu alloue ta structure;
// Je sais plus exactement, ca fait longtemps que g pas fait de C.
listeMot = (struct motMaillon *)malloc(sizeof(struct motMaillon)) ; // un truc du genre.
// Tu fais pointer le courant :
courant = listeMot ;
// Tu ouvre ton fichier à lire :
si ( ! (fic <-- ouvrir("monfichier")) )
retour <-- -1
tant que ( (maLettre <-- fgetc(fic)) != (null ou EOF) ) faire :
selon que (maLettre) :
cas « caractère séparateur » : // Caractère espace.
faire un chainage sur le prochain mot
cas « autre » : // Caractère tabulation
faire chainage sur prochaine lettre du mot
cas defaut :
rien faire
fselon
ftant
// traitement du cas null ou EOF (fin de fichier)
ici il faut finir de chainer correctement ta liste chainée de lettre et de mot.
// fermeture fichier
close(fic) ;
}
Ceci constitue un squellette fais avec mes souvenir et fait à l'arrache pour t'aiguiller.
j'espere avoir répondu à tes besoin et bonne chance. ++
Si tu sais faire des liste chainée, tres simple :
voici l'algo en gros pour faire ton truc :
admettons que tu a une structure mot et lettre que tu défini plus haut bien sur et du type suivant :
typedef struct lettreMaillon {
char * car;
struct lettreMaillon *prochaineLettre;
struct lettreMaillon *lettrePrecedante;
};
// double liste chainée de mot : chaque mot étant constitué d'une double liste chainée de lettre 'lettreMaillon':
typedef struc motMaillon {
struct lettreMaillon *premiereLettreDuMot;
struct motMaillon *prochainMot;
struct motMaillon *motPrecedent;
};
int main () {
struct motMaillon *listeMot = null;
struct motMaillon *courant = null;
char *malettre = null;
// Tu alloue ta structure;
// Je sais plus exactement, ca fait longtemps que g pas fait de C.
listeMot = (struct motMaillon *)malloc(sizeof(struct motMaillon)) ; // un truc du genre.
// Tu fais pointer le courant :
courant = listeMot ;
// Tu ouvre ton fichier à lire :
si ( ! (fic <-- ouvrir("monfichier")) )
retour <-- -1
tant que ( (maLettre <-- fgetc(fic)) != (null ou EOF) ) faire :
selon que (maLettre) :
cas « caractère séparateur » : // Caractère espace.
faire un chainage sur le prochain mot
cas « autre » : // Caractère tabulation
faire chainage sur prochaine lettre du mot
cas defaut :
rien faire
fselon
ftant
// traitement du cas null ou EOF (fin de fichier)
ici il faut finir de chainer correctement ta liste chainée de lettre et de mot.
// fermeture fichier
close(fic) ;
}
Ceci constitue un squellette fais avec mes souvenir et fait à l'arrache pour t'aiguiller.
j'espere avoir répondu à tes besoin et bonne chance. ++
J'ai lu vite fait l'algo donc je me plante peut être, mais y'a un truc qui me gêne dans ta solution. Il veut faire une recherche de mot. Et le fait de faire une liste chainée de lettres pour chaque mot va rendre le matching compliqué puisque les caractères ne seront pas contigus en mémoire. La liste chainée de mots c'est une bonne solution, par contre pour moi un mot ça doit être un char* comme ça tu parcours ta liste, à chaque élément de la liste tu te fais un strcmp avec le mot que tu veux matcher et voilà c'est réglé.
Merci pour vos reponse,
mais pour te repondre Kij je dirai juste que pour l'instant j'ai seulement réussi a insrerer ma liste chainée de mots dans un fichier, mais maintenant j'aurai envie de rechercher un mot dans un fichier...donc il fodrai que jrécupere chaque mot contenu dans le fichier et que j'le mette dans ma liste chainée, mot par mot.
Et donc j'aimerai savoir si (a part la méthode caractère par caractère) il n'yaurai pa un autre moyen ou une fonction deja défini pour pouvoir récuperer un mot directement et a chaque à fois qu'il trouve un "espace" bah il le saute et stock le prochain mot..
Mais si il fo vraiment passé par la méthode de récuperation de caractère par caractere (avec le fget(fichier)) j'aimerai savoir comment jpourrai procéder de manière simple (si possible :p lol)
Merci encor pour vos reponse et si vous avez des suggestion jsui toujours preneur ;) ++
mais pour te repondre Kij je dirai juste que pour l'instant j'ai seulement réussi a insrerer ma liste chainée de mots dans un fichier, mais maintenant j'aurai envie de rechercher un mot dans un fichier...donc il fodrai que jrécupere chaque mot contenu dans le fichier et que j'le mette dans ma liste chainée, mot par mot.
Et donc j'aimerai savoir si (a part la méthode caractère par caractère) il n'yaurai pa un autre moyen ou une fonction deja défini pour pouvoir récuperer un mot directement et a chaque à fois qu'il trouve un "espace" bah il le saute et stock le prochain mot..
Mais si il fo vraiment passé par la méthode de récuperation de caractère par caractere (avec le fget(fichier)) j'aimerai savoir comment jpourrai procéder de manière simple (si possible :p lol)
Merci encor pour vos reponse et si vous avez des suggestion jsui toujours preneur ;) ++
Bien sur , tout a fait d'accord avec vous deux, g donné une réponse à l'arache comme ca, il doit y avoir une fonction déjà toute faite qui te prend mot par mot, ou laors tu la fait vite fait toi même ! (c pas dur, par exemple, tu fais lettre par lettre tant que tu tombe pas sur un caractère séparateur) ou une autre méthodes, mais attend deux sec, je v chercher un peu plus en profondeur ...
++
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je sais pas si y'a une fonction qui existe deja, dans mon ecole ils nous forcent a tout recoder, meme les strlen et le malloc, alors une fonction qui renvoie des mots j'ai jamais regarde si ca existait.
Mais a coder c pas bien dur. Dans un premier temps t'embette pas a optimiser en bufferisant pour limiter les appels systeme, tu fais une fonction qui lit caractere par caractere dans ton fichier, et qui les stocke dans un char*. et des qu'elle tombe sur un espace elle te renvoie le char* a ta fonction principale qui elle s'occupe de stocker les mots un par un dans la liste chainee.
Si t'as un probleme, hesite pas a me mailer, je t'aiderai a faire ton algo. Ce genre de manipulations de chaines de caracteres, c'est ce qui fait regretter les string et autres conteneurs du C++. ^^
Mais a coder c pas bien dur. Dans un premier temps t'embette pas a optimiser en bufferisant pour limiter les appels systeme, tu fais une fonction qui lit caractere par caractere dans ton fichier, et qui les stocke dans un char*. et des qu'elle tombe sur un espace elle te renvoie le char* a ta fonction principale qui elle s'occupe de stocker les mots un par un dans la liste chainee.
Si t'as un probleme, hesite pas a me mailer, je t'aiderai a faire ton algo. Ce genre de manipulations de chaines de caracteres, c'est ce qui fait regretter les string et autres conteneurs du C++. ^^
j'ai un probleme au niveau de segmentation d'un texte arabe imprimé pour faire la reconnaissance par réseau de neurone artificiel
ilham : c'est quoi le rapport avec la question en cours ?
abaze : ben en fait la solution est simple : si tu insère toi même tes nom dans ton fichier, alors pour les séparer tu n'a qu'a aller à la ligne. Comme ca pour la recherche de mot, tu prend une ligne entière (c'est à dire jusqu'au prochain retour à la ligne) et tu le met dans tu compare avec l'ensemble de ta liste pou voir s'il est dedans.
@++
abaze : ben en fait la solution est simple : si tu insère toi même tes nom dans ton fichier, alors pour les séparer tu n'a qu'a aller à la ligne. Comme ca pour la recherche de mot, tu prend une ligne entière (c'est à dire jusqu'au prochain retour à la ligne) et tu le met dans tu compare avec l'ensemble de ta liste pou voir s'il est dedans.
@++
MErci pour vos reponse, Yanouss kij82 et tlm
bah jvai essayer d'suivre vos conseil
jvai tester ta méthode Yanouss et jvai voir ske ca pe donner ;)
C klr que c regrettable de pas avoir des conteneur de String......ca irai bocoup plus vite !
Mais bon on va faire avec s'qu'il ya, et merci pour ton aide si jai un probleme jessayerai de te laisser un msg par mail ya pa d'souci.
et pour repondre à la suggeston (de ché plus qui percisement dsl lol) comme koi lors de mes insertion de mot dans un fichier je fait un retour chariot a chak fois....bah c un pe delicat car mon aplication en fait elle devrat faire en sorte de faire une recherche de mot sur des fichier texte deja existant.....la recherche de texte doit se faire sur n'importe kel fichier texte que tu désire en fait (oula jcroi jai du mal a mexprimer lol mais bon en gros tu rentre un nom de fichier texte et ca te di cb ya de mot dedans et tu pe faire une recherche d'un mot particuler et ca te di cb de fois il aparait)
Bah sur ce jvai tenter d'avancer mon projet et jespere que jvai en finir vite avec (ca comence a me monter a la tete là lol)
Alé merci tlm @+++
bah jvai essayer d'suivre vos conseil
jvai tester ta méthode Yanouss et jvai voir ske ca pe donner ;)
C klr que c regrettable de pas avoir des conteneur de String......ca irai bocoup plus vite !
Mais bon on va faire avec s'qu'il ya, et merci pour ton aide si jai un probleme jessayerai de te laisser un msg par mail ya pa d'souci.
et pour repondre à la suggeston (de ché plus qui percisement dsl lol) comme koi lors de mes insertion de mot dans un fichier je fait un retour chariot a chak fois....bah c un pe delicat car mon aplication en fait elle devrat faire en sorte de faire une recherche de mot sur des fichier texte deja existant.....la recherche de texte doit se faire sur n'importe kel fichier texte que tu désire en fait (oula jcroi jai du mal a mexprimer lol mais bon en gros tu rentre un nom de fichier texte et ca te di cb ya de mot dedans et tu pe faire une recherche d'un mot particuler et ca te di cb de fois il aparait)
Bah sur ce jvai tenter d'avancer mon projet et jespere que jvai en finir vite avec (ca comence a me monter a la tete là lol)
Alé merci tlm @+++