Chercher une chaine dans un fichier texte C
stroumpf
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je décris mon probleme
J'ai deux fichiers texte :
-Le premier fichier est sous cette forme là :
un petit -> little (0.9)
Je suis -> I (0.8)
suis un -> am (0.7)
dans le -> in (0.6)
oiseau dans -> bird (0.5)
petit oiseau -> bird (0.4)
dans le -> out (0.4)
le ciel -> sky (0.4)
-Le deuxième fichier est sous cette forme là :
Je suis un petit oiseau dans le ciel
Je suis un petit oiseau dans le ciel bleu
J'aimerai parcourir le 1er fichier , recuperer à chaque fois la chaine à gauche de la fleche (par exp :" je suis") , et la chercher dans tout le 2eme fichier.
Si on la trouve on concatene les deux mots
Donc on aura par exemple
Je+suis un petit oiseau dans le cielt
...
J'ai fait cet essai
Mais il m'affiche comme quoi il ne trouve pas la 1ere chaine (je suis) dans le deuxieme fichier:
Avez vous une idée svp?
Merci
Je décris mon probleme
J'ai deux fichiers texte :
-Le premier fichier est sous cette forme là :
un petit -> little (0.9)
Je suis -> I (0.8)
suis un -> am (0.7)
dans le -> in (0.6)
oiseau dans -> bird (0.5)
petit oiseau -> bird (0.4)
dans le -> out (0.4)
le ciel -> sky (0.4)
-Le deuxième fichier est sous cette forme là :
Je suis un petit oiseau dans le ciel
Je suis un petit oiseau dans le ciel bleu
J'aimerai parcourir le 1er fichier , recuperer à chaque fois la chaine à gauche de la fleche (par exp :" je suis") , et la chercher dans tout le 2eme fichier.
Si on la trouve on concatene les deux mots
Donc on aura par exemple
Je+suis un petit oiseau dans le cielt
...
J'ai fait cet essai
Mais il m'affiche comme quoi il ne trouve pas la 1ere chaine (je suis) dans le deuxieme fichier:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE* fichier = NULL; FILE* fichier2 = NULL; char chaine[50]; char chaine2[50]; int n=0; char mot1[50], mot2[50]; char *sous_chaine, *tmp; fichier = fopen("IMC_Test.txt", "r"); fichier2 = fopen("CorpusTest.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine, sizeof chaine, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine); // On affiche la chaîne qu'on vient de lire sscanf(chaine,"%[^-]", mot1); printf("%s\n", mot1); if (fichier2 != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine2, sizeof chaine, fichier2) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine2); // On affiche la chaîne qu'on vient de lire if ((sous_chaine = strstr(chaine, chaine2)) == NULL) printf("%s", sous_chaine); return EXIT_FAILURE; /* cherche un espace dans 'sous_chaine' */ if ((tmp = strchr(sous_chaine, ' ')) == NULL) return EXIT_FAILURE; /* remplace l'espace par '+' */ *tmp = '+'; printf("%s\n", sous_chaine); return EXIT_SUCCESS; } } } fclose(fichier); // On ferme le fichier qui a été ouvert fclose(fichier2); // On ferme le fichier qui a été ouvert } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier test.txt"); } return 0; }
Avez vous une idée svp?
Merci
A voir également:
- Chercher une chaine dans un fichier texte C
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
4 réponses
dans ta fonction strstr, tu n'aurais pas échangé l'ordre des arguments ?
il me semble que la fonction est :
char *strstr (const char *meule_de_foin, const char *aiguille);
(avec de très bon noms d'arguments, tiré de http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html :) )
en lisant, j'ai compris que tu cherchais chaine dans chaine2, et pas chaine2 dans chaine.
il me semble que la fonction est :
char *strstr (const char *meule_de_foin, const char *aiguille);
(avec de très bon noms d'arguments, tiré de http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html :) )
en lisant, j'ai compris que tu cherchais chaine dans chaine2, et pas chaine2 dans chaine.
Merci Pacorabanix pour ta reponse,
En fait je cherche Mot1 dans chaine2
Le probleme là c'est quil maffiche "sous_chaine" c'est toute la phrase et non pas la chaine recherchée
Tu as une idée?
Merci
Best regards
En fait je cherche Mot1 dans chaine2
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE* fichier = NULL; FILE* fichier2 = NULL; char chaine[50]; char chaine2[50]; int n=0; char mot1[50], mot2[50]; char *sous_chaine, *tmp; fichier = fopen("IMC_Test.txt", "r"); fichier2 = fopen("CorpusTest.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine, sizeof chaine, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine); // On affiche la chaîne qu'on vient de lire sscanf(chaine,"%[^-]", mot1); printf("%s\n", mot1); if (fichier2 != NULL) { // On peut lire et écrire dans le fichier while (fgets(chaine2, sizeof chaine, fichier2) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL) { printf("%s", chaine2); // On affiche la chaîne qu'on vient de lire if ((sous_chaine = strstr(chaine2, mot1)) != NULL) printf("%s", sous_chaine); } } } fclose(fichier); // On ferme le fichier qui a été ouvert fclose(fichier2); // On ferme le fichier qui a été ouvert } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier test.txt"); } return 0; }
Le probleme là c'est quil maffiche "sous_chaine" c'est toute la phrase et non pas la chaine recherchée
Tu as une idée?
Merci
Best regards
oui.
strstr renvoie un pointeur vers l'endroit dans la chaine ou le mot recherché commence.
mais c'est un pointeur dans la chaine elle-même. donc au tout début de la chaine, puisque le mot est au début.
si tu essaies d'afficher la chaine, afficher le pointeur trouvé, il va afficher toute la chaine, car la fonction strstr n'a pas crée de nouvelle chaine, elle n'a pas rajouté de caractère '\0' pour marquer la fin de la recherche non-plus.
donc strstr a bien trouvé ta chaine !
si tu veux juste "l'afficher", il faut copier le bon nombre de caractères (sizeof(mot1)) à partir de l'endroit pointé par sous-chaine. mais je ne sais pas si c'est vraiment ce que tu veux faire. (tu veux afficher juste pour tester que ta recherche marche bien ? )
strstr renvoie un pointeur vers l'endroit dans la chaine ou le mot recherché commence.
mais c'est un pointeur dans la chaine elle-même. donc au tout début de la chaine, puisque le mot est au début.
si tu essaies d'afficher la chaine, afficher le pointeur trouvé, il va afficher toute la chaine, car la fonction strstr n'a pas crée de nouvelle chaine, elle n'a pas rajouté de caractère '\0' pour marquer la fin de la recherche non-plus.
donc strstr a bien trouvé ta chaine !
si tu veux juste "l'afficher", il faut copier le bon nombre de caractères (sizeof(mot1)) à partir de l'endroit pointé par sous-chaine. mais je ne sais pas si c'est vraiment ce que tu veux faire. (tu veux afficher juste pour tester que ta recherche marche bien ? )
// estDans est une fonction qui renvoie 1 si mainStr contient subStr int StartsWith(const char *mainStr,const char *subStr) { if (*subStr == '\0') return 1; if (*mainStr != *subStr) return 0; return StartsWith(mainStr+1,subStr+1); } int estDans(const char *mainStr,const char *subStr) { if (StartsWith(mainStr,subStr)) return 1; if (*mainStr == '\0') return 0; return estDans(mainStr+1,subStr); }