IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Chercher et remplacer une chaine dans un fichier texte C


Sujet :

C

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut Chercher et remplacer une chaine dans un fichier texte C
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #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
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je tiens à conseiller qu'il faut garder bien structuré ce genre de programme. Cela permet de mieux comprendre ce qui se passe et de faire moins d'erreur.
    Je dis cela, notamment pour l'ouverture des fichiers, qui pourrait être à l'extérieur de toutes boucles (genre, si on ne peux pas ouvrir un fichier, ce n'est pas la peine de faire quoique ce soit).

    De plus, l'indentation est très importante.

    Sinon, pour le code, j'ai l'impression que le programme s'arrête tout le temps. Et ce à cause des lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ((sous_chaine = strstr(chaine, chaine2)) == NULL)
                printf("%s", sous_chaine);
               return EXIT_FAILURE;
    Enfin bref, cela est peut être fait exprès.
    Sinon, l'erreur, c'est que vous chercher chaine dans 'chaine2'. Alors que vous auriez du chercher 'mot1' dans 'chaine2'.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    La fonction strstr retourne une valeur non nulle si elle a trouver chaine2 dans chaine. Or avec le test écrit tel quel, obligatoirement cela sortira en EXIT_FAILURE.
    Il faut "inversé" le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((sous_chaine = strstr(chaine, chaine2)) == NULL) 
        return EXIT_FAILURE ;
    printf("%s", sous_chaine) ;
    Attention à l'indentation, car cela peu poser des problèmes lors des recherches de fonctionnement. Par principe, mettre des accolades par défaut, quitte à les supprimer après.

    Le fait de faire un return EXIT_FAILURE en plein milieu du code n'est pas très bon, car tu ne fermes pas les fichiers (le système le fait, mais bon, soit on fait propre, soit ...).


    Bonne continuation.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci
    Bonsoir à tous
    J'aimerai savoir comment faire pour lire en boucle un fichier texte; en d'autres termes quand il atteint la derniere ligne du fichier il revient à la 1ere ligne etc...
    J'ai fait cet essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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 chaine2, 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)
                {
     
                /* cherche un espace dans 'sous_chaine' */
                    if ((tmp = strchr(sous_chaine, ' ')) == NULL)
                    {
                    return EXIT_FAILURE;
                    }
                /* remplace l'espace par '+' */
                    *tmp = '+';
                    fprintf(fichier3, "%s", chaine2);
     
                }
                }
                }
            }
    Mais quand le fichier2 atteint la fin du fichier il ne recommence pas la lecture des le debut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(chaine2, sizeof chaine2, fichier2) != NULL)
    Comment faire cela?

    Merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  5. #5
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonsoir,

    Je pense que la fonction fseek(...) devrait convenir. Cette fonction permet de modifier l'indexation courante du fichier.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    do {
        // Position en début de fichier
        fseek(fichier2, 0L, SEEK_SET) ;
        // Lecture jusqu'à fin de fichier
        while (fgets(chaine2, sizeof(chaine2), fichier2) != NULL) {
            ...
        }
    } while(endBloc) ;     // Condition de sortie
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  6. #6
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci pour ton aide , mais reste un ti souci encore :
    C'est que quand je mets ce contenu dans le fichier2 :
    Je suis un petit oiseau dans le ciel vert
    un petit garcon


    Il me produit un fichier resultat :
    Je suis un+petit oiseau dans le ciel vert
    un+petit garcon
    Je+suis un petit oiseau dans le ciel vert


    Au lieu de :

    Je+suis un+petit oiseau dans le ciel vert
    un+petit garcon


    Voilà mon ti bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[])
    {
        FILE* fichier = NULL;
        FILE* fichier2 = NULL;
        FILE* fichier3 = 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");
        fichier3 = fopen("res.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)
                {
                 do// boucle infinie
                {
                fseek(fichier2, 0, SEEK_SET); // on se positionne au debut du fichier
     
            // On peut lire et écrire dans le fichier
                while (fgets(chaine2, sizeof chaine2, 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)
                {
     
                /* cherche un espace dans 'sous_chaine' */
                    if ((tmp = strchr(sous_chaine, ' ')) == NULL)
                    {
                    return EXIT_FAILURE;
                    }
                /* remplace l'espace par '+' */
                    *tmp = '+';
                    fprintf(fichier3, "%s", chaine2);
                }
                }
     
                 printf("%s", chaine);
     
                }
                 while (chaine== NULL);
     
              }
            }
     
            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;
    }
    Une idée?
    Merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    C'est à ce moment là, qu'une solution de travail en mémoire est beaucoup plus pratique.
    Je m'explique (du moins, j'essaie).

    Vous faites une première boucle, qui modifiera le fichier. Ok, cela vous donne un nouveaux fichiers avec des '+' dedans.
    Et puis, vous refaites la boucle, sur ce même premier fichier (du coup, les changements précédents ne sont pas pris en compte).

    La solution serait qu'après un premier passage, vous utilisez le fichier3 pour le deuxième passage. Mais cela est lourd, peut efficace une fois en place (et encore, ce n'est pas si facile que ça).

    La seconde solution, c'est de travailler dans la mémoire. Le truc c'est de mettre le contenu de fichier1 en mémoire, puis de travailler que dans la mémoire à rajouter les '+'. Une fois cela fait, on sauvegarderai le résultat dans fichier 3.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Remplacer une ligne dans un fichier texte !
    Par toulouz1 dans le forum VBScript
    Réponses: 23
    Dernier message: 19/07/2017, 10h26
  2. Modifier une chaine dans un fichier texte
    Par ruyeken dans le forum Android
    Réponses: 4
    Dernier message: 29/05/2013, 11h57
  3. chercher une chaine dans un fichier
    Par bwwilly dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2007, 15h03
  4. detruire une chaine dans un fichier texte
    Par rober dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 08/11/2006, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo