Chercher une chaine dans un fichier texte C

Fermé
stroumpf - 12 nov. 2011 à 23:07
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 déc. 2013 à 10:59
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:

#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:

4 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
13 nov. 2011 à 00:18
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.
0
Merci Pacorabanix pour ta reponse,
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
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
14 nov. 2011 à 14:58
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 ? )
0
// 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);
}
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
14 déc. 2013 à 10:59
Bonjour,
Je ne crois pas que la question soit : "recréer la fonction strstr() en récursif" ;-)
0