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 :

Copie de fichier dans un autre avec remplacement d'expressions


Sujet :

C

  1. #1
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut Copie de fichier dans un autre avec remplacement d'expressions
    Salut à tous,

    Je dois créer des fichiers en chaine avec tous la meme forme seulement ils different a certains endroits.

    Est-ce que c'est possible de mettre des variables dans le fichier de references ou des signes comme [VARIABLE] et les changer quand on les trouve tout en recopiant dans le nouveau fichier?? Et comment faire?

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Je dois créer des fichiers en chaine avec tous la meme forme seulement ils different a certains endroits.

    Est-ce que c'est possible de mettre des variables dans le fichier de references ou des signes comme [VARIABLE] et les changer quand on les trouve tout en recopiant dans le nouveau fichier?? Et comment faire?
    Aucun rapport avec le langage C. Il faut définir un critère infaillible qui permet au programme de savoir ce qu'il a à faire. C'est à toi de choisir une séquence de caractères (balisage) qui ne peut être confondue avec aucune autre, comme
    §variable
    {variable}
    [variable]
    etc.

    C'est une question de Spécifications, section 'interface'.

  3. #3
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Certes mais je parlais de code proprement di... Pour ce qui est du fichier je m'en charge et je m'adapte. Ce n'est pas un soucis

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Certes mais je parlais de code proprement di... Pour ce qui est du fichier je m'en charge et je m'adapte. Ce n'est pas un soucis
    Donne une spécification claire et on verra comment concevoir un algorithme en conséquence. Ca n'a toujours aucun rapport avec le codage. Il faut faire les choses dans l'ordre...

  5. #5
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Ok en gros j'peux aussi donner l'en-tête ca pourra t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void copierEtRemplacer(FILE *fichierACopier, FILE *fichierResultat, char *chaineATrouver, char *chaineRemplace);
    En gros je veux copier le fichierACopier dans le fichierResultat.
    Aussi, dans le fichierACopier c'est un fichier dans lequel on trouvera plusieurs chaineATrouver et fodra les remplacer par chaineRemplace dans le fichierResultat.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Ok en gros j'peux aussi donner l'en-tête ca pourra t'aider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void copierEtRemplacer(FILE *fichierACopier, FILE *fichierResultat, char *chaineATrouver, char *chaineRemplace);
    En gros je veux copier le fichierACopier dans le fichierResultat.
    Aussi, dans le fichierACopier c'est un fichier dans lequel on trouvera plusieurs chaineATrouver et fodra les remplacer par chaineRemplace dans le fichierResultat.
    Je préfèrerais une interface comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void copierEtRemplacer (char const *fichierACopier, 
                            char const *fichierResultat, 
                            char const *chaineATrouver, 
                            char const *chaineRemplace);
    car il n'y a aucune raison d'ouvrir et de fermer les fichiers ailleurs...

    Ce que tu veux faire est relativement simple si c'est un fichier texte. Il faut aussi savoir si tu veux remplacer uniquement la première occurrence ou toutes les occurrences (ou la nième etc.). Il faut peut être un paramètre de plus pour ça, genre 0=toutes 1,2 etc.=nième.

  7. #7
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Ce que tu veux faire est relativement simple si c'est un fichier texte. Il faut aussi savoir si tu veux remplacer uniquement la première occurrence ou toutes les occurrences (ou la nième etc.).
    Je veux remplacer toutes les occurences.

    Je préfèrerais une interface comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void copierEtRemplacer (char const *fichierACopier, 
                            char const *fichierResultat, 
                            char const *chaineATrouver, 
                            char const *chaineRemplace);
    Si tu veux, je donnais l'en-tête juste pour indiquer en gros ce que je comptais faire.

    Mais je ne vois toujours pas comment faire ma fonction ...

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Je veux remplacer toutes les occurences.


    Si tu veux, je donnais l'en-tête juste pour indiquer en gros ce que je comptais faire.

    Mais je ne vois toujours pas comment faire ma fonction ...
    Bah, il faut commencer par ecrire l'algorithme.

    En supposant que c'est un fichier texte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Ouvrir le fichier source en lecture
    Ouvrir le fichier destination en écriture
    Tant que ce n'est pas la fin de fichier
     Lire le fichier source ligne par ligne
     Chercher et remplacer le mot dans la ligne
     Ecrire la ligne dans le fichier de destination
    Fermer le fichier destination
    Fermer le fichier source
    C'était difficile ?

    Commence déjà par ça.

    La difficulté sera ensuite de coder "Chercher et remplacer le mot dans la ligne". On verra plus tard.

  9. #9
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    La difficulté n'était pas, il est vrai, dans l'écriture de l'algorithme mais plutôt au niveau de la programmation.

    D'ailleurs, j'ai passé du temps à essayer de le faire, mais pour le moment sans succès.
    J'arrive lire le fichier origine, et le copier dans le fichier destination, mais entre ces deux actions, je n'arrive pas à effectuer la modification du mot..

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    La difficulté n'était pas, il est vrai, dans l'écriture de l'algorithme mais plutôt au niveau de la programmation.

    D'ailleurs, j'ai passé du temps à essayer de le faire, mais pour le moment sans succès.
    J'arrive lire le fichier origine, et le copier dans le fichier destination, mais entre ces deux actions, je n'arrive pas à effectuer la modification du mot..
    Et on est censés deviner ce que signifie 'je n'arrive pas' ?

    As-tu réfléchi à la question ? As-tu décrit précisément les opérations attendues ? As-tu élaboré un algorithme ? Ca ne tombe pas du ciel tout ça. Il y a des procédures à mettre en oeuvre et il faut un tout petit peu réfléchir. Une fois qu'on sait où on va, on peut coder. Si ça ne marche pas, on peut commencer par publier l'algorithme (pas le code, ok ?) pour obtenir un avis dessus.

  11. #11
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Mais oui allez c'est bien!!!

    Merci beaucoup pour ton aide precieuse!!! pffff

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Mais oui allez c'est bien!!!

    Merci beaucoup pour ton aide precieuse!!! pffff
    Désolé d'avoir essayé de t'aider ...

    Mais ce n'est pas ici que tu trouveras un pigeon pour te fournir une réponse toute faite, alors que tu ne montres pas le résultat de ta reflexion.

    "Si tu donnes un poisson à un homme, il mangera un jour.
    Si tu lui apprends à pêcher, il mangera tous les jours"

  13. #13
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Je ne demande pas une réponse toute faite, loin de la. Voici le résultat de ma reflexion.
    Le programme fonctionne mais il ne couvre pas tous les cas.
    J'ai encore un petit problème pour gérer les espaces car il faut aussi que ma fonction retrouve les motifs dans des mots comme : blablabla{MOTIF}blabla

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define TAILLE_MAX 100
    #define DELIMITEUR " \0"
     
    void
    copyFileWithModif (char *fileName, char *fileNameCreate, char *text,
    		   char *textChange)
    {
     
    	char ligne[TAILLE_MAX] = "";
    	char ligne_out[TAILLE_MAX] = "";	//ligne de sortie, celle ecrite dans le fileNameCreate
    	char mot[TAILLE_MAX] = "";
    	FILE *depart, *arrivee;
     
     
    	depart = fopen (fileName, "r");
     
    	if (!depart)
    	{
    		printf ("ERREUR: Impossible d'ouvrir le fichier: %s.\n",
    			fileName);
    		exit (-1);
    	}
    	arrivee = fopen (fileNameCreate, "w");
     
    	if (!arrivee)
    	{
    		printf ("ERREUR: Impossible d'ouvrir le fichier: %s.\n",
    			fileNameCreate);
    		exit (-1);
    	}
     
    	char *pch;
    	int i;
    	while (fgets (ligne, TAILLE_MAX, depart) != NULL)
    	{
    		char * tmp = strchr(ligne, '\n');
    		strcpy(tmp, " \n");
    		i = 0;
    		pch = strtok (ligne, " ");
    		while (pch != NULL)
    		{
    			if (strcmp (pch, text) == 0)
    			{
    				if(i>0)
    					strcat (ligne_out, " ");
    				strcat (ligne_out, textChange);
    			}
    			else
    			{
    				if(i>0)
    					strcat (ligne_out, " ");
    				strcat (ligne_out, pch);
    			}
    			pch = strtok (NULL, DELIMITEUR);
    			i++;
    		}
     
    		fputs (ligne_out, arrivee);
    		strcpy (ligne_out, "");	//Reinitialisation de ligne_out
    	}
     
    	fclose (depart);
     
    	fclose (arrivee);
    }
     
     
     
    int
    main (int argc, char *argv[])
    {
     
    	copyFileWithModif ("c.txt", "obtenu.txt", "ca", "tut");
     
    }

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Je ne demande pas une réponse toute faite, loin de la. Voici le résultat de ma reflexion.
    Le programme fonctionne mais il ne couvre pas tous les cas.
    J'ai encore un petit problème pour gérer les espaces car il faut aussi que ma fonction retrouve les motifs dans des mots comme : blablabla{MOTIF}blabla
    J'ai modifié le code pour bien séparer la fonction de remplacement du reste :
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define TAILLE_MAX 100
    #define DELIMITEUR " \0"
     
    int search_and_replace (char *ligne, char *ligne_out,
                            char const *text, char const *textChange)
    {
       int ok = 0;
       char *pch;
       int i = 0;
       char *tmp = strchr (ligne, '\n');
       strcpy (tmp, " \n");
       pch = strtok (ligne, " ");
       while (pch != NULL)
       {
          if (strcmp (pch, text) == 0)
          {
             if (i > 0)
                strcat (ligne_out, " ");
             strcat (ligne_out, textChange);
          }
          else
          {
             if (i > 0)
                strcat (ligne_out, " ");
             strcat (ligne_out, pch);
          }
          pch = strtok (NULL, DELIMITEUR);
          i++;
       }
       return ok;
    }
     
    int
    copyFileWithModif (char const *fileName, char const *fileNameCreate,
                       char const *text, char const *textChange)
    {
       int ret = EXIT_SUCCESS;
       FILE *depart = fopen (fileName, "r");
     
       if (depart != NULL)
       {
          FILE *arrivee = fopen (fileNameCreate, "w");
     
          if (arrivee != NULL)
          {
             char ligne[TAILLE_MAX] = "";
     
             while (fgets (ligne, TAILLE_MAX, depart) != NULL)
             {
    /* ligne de sortie, celle ecrite dans le fileNameCreate */
                char ligne_out[TAILLE_MAX] = "";
                int change =
                   search_and_replace (ligne, ligne_out, text, textChange);
                if (change)
                {
                   fputs (ligne_out, arrivee);
                }
                else
                {
                   fputs (ligne, arrivee);
                }
             }
             fclose (arrivee);
          }
          else
          {
             printf ("ERREUR: Impossible d'ouvrir le fichier: %s.\n",
                     fileNameCreate);
             ret = EXIT_FAILURE;
          }
          fclose (depart);
       }
       else
       {
          perror (fileName);
          ret = EXIT_FAILURE;
       }
       return ret;
    }
     
    int main (void)
    {
       int ret = copyFileWithModif ("c.txt", "obtenu.txt", "ca", "tut");
       return ret;
    }
    Il faut donc maintenant se concentrer sur le code de la fonction 'search_and_replace()', car malheureusement, il est d'une complexité inutile.

    D'abord, pourquoi 100 char ? Est-on sûr que ça couvre tous les cas. Une ligne ne peut dépasser 98 caractères utiles ? Et si le mot de remplacement est long, ça ne va pas dépasser ? Quelles sont les contraintes ?

    Ensuite, le remplacement proprement dit commence par une recherche du mot à remplacer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    - chercher le mot dans la chaine initiale
    - SI on l'a trouvé, 
      le remplacer par le nouveau mot
    Le remplacement consiste à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    - copier la partie inchangée de la chaine dans la nouvelle chaine.
    - copier le mot nouveau dans la nouvelle chaine
    - copier la fin de l'ancienne chaine à partir de la fin de l'ancien mot, dans la nouvelle.
    Evidemment, il faut répéter l'opération tant que le mot est dans la chaine initiale.

    C'est ce genre de reflexion simple que je demande. C'est difficile de poster ça ?
    A partir de là, on peut élaborer un code simple qui fait exactement ce qui a été décrit au-dessus (attention, code 'brut' compilé mais non testé).
    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
     
    #include <string.h>
     
    int search_and_replace (char *ligne, char *ligne_out,
                            char const *text, char const *textChange)
    {
       int ok = 0;
       /* debut de la chaine a traiter */
       char *p_ligne = ligne;
       char *p_mot;
     
    /* nettoyage de la chaine de destination */
       strcpy (ligne_out, "");
     
       while ((p_mot = strstr (p_ligne, text)) != NULL)
       {
    /* copier le debut de la ligne */
          strncat (ligne_out, p_ligne, p_mot - p_ligne);
    /* copier le nouveau mot */
          strcat (ligne_out, textChange);
    /* 'sauter' l'ancien mot */
          p_ligne += strlen (text);
    /* copier la fin de la ligne */
          strcat (ligne_out, p_ligne);
       }
       return ok;
    }
    Je te laisse mettre ce code au point, parce que chez moi, ça commence comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    c.txt: No such file or directory
     
    Press ENTER to continue.

  15. #15
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Merci beaucoup

    Je vais la mettre au point et je te redis ce que ça a donnée


    ------------------------------------------------------------------------------------
    Ca marche pas... Changement de code : Voir page suivante MERCI
    ------------------------------------------------------------------------------------

  16. #16
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Re...

    Bon j'ai trouvé une fonction sur le net qui fesait ca plutot comme je voulais (sans les espaces)

    Par contre y'a un petit probleme c'est qu'elle me mettra des fois des caracteres en début de ligne je C pas pk... :/
    Et moi je veu quelle soit parfaite

    Ca fait un baille que je suis dessus et je trouve pas le pb...
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    char *str_replace (const char *txt, const char *Avant, const char *Apres)
    {
      const char *pos;      /* Position d'une occurance de Avant dans txt */
      char *TxtRetour;      /* La chaine retournée */
      size_t PosTxtRetour;  /* Position du prochain caractère à écrire */
                            /* dans TxtRetour */
      size_t Long;          /* Long d'une chaine à écrire dans TxtRetour */
      size_t TailleAllouee; /* Taille allouée à TxtRetour */
     
      /* Cherche la première occurence */
      pos = strstr (txt, Avant);
     
      /* Aucune occurrences : renvoie simplement une copie de la chaine */
      if (pos == NULL)
      {
        return NULL;
      }
     
      /* Alloue une nouvelle chaine */
      Long = (size_t)pos - (size_t)txt;
      TailleAllouee = Long + strlen (Apres) + 1;
      TxtRetour = malloc (TailleAllouee);
      PosTxtRetour = 0;
     
      /* Copie la première partie de la chaîne sans occurrence */
      strncpy (TxtRetour + PosTxtRetour, txt, Long);
      PosTxtRetour += Long;
      txt = pos + strlen (Avant);
     
      /* Ajoute la chaîne de remplacement Apres */
      Long = strlen (Apres);
      strncpy (TxtRetour + PosTxtRetour, Apres, Long);
      PosTxtRetour += Long;
     
      /* Cherche la prochaine occurrence */
      pos = strstr (txt, Avant);
      while (pos != NULL)
      {
        /* Agrandit la chaine */
        Long = (size_t)pos - (size_t)txt;
        TailleAllouee += Long + strlen (Apres);
        TxtRetour = (char *)realloc (TxtRetour, TailleAllouee);
     
        /* Copie ce qu'il y a entre la dernier occurrence et la nouvelle */
        strncpy (TxtRetour + PosTxtRetour, txt, Long);
        PosTxtRetour += Long;
     
        /* Passe l'occurrence */
        txt = pos + strlen (Avant);
     
        /* Ajoute la chaîne de remplacement */
        Long = strlen (Apres);
        strncpy (TxtRetour + PosTxtRetour, Apres, Long);
        PosTxtRetour += Long;
     
        /* Cherche la prochaine occurrence */
        pos = strstr (txt, Avant);
      }
     
      /* Ajoute le reste de la chaîne (il reste au moins '\0') */
      Long = strlen (txt) + 1;
      TailleAllouee += Long;
      TxtRetour = realloc (TxtRetour, TailleAllouee);
      strncpy (TxtRetour + PosTxtRetour, txt, Long);
      return TxtRetour;
    }
     
    int copyFileWithModif (char const *fileName, char const *fileNameCreate, char **chaineAChercher, char **chaineARemplacer){
     
    	int ret = EXIT_SUCCESS;
    	FILE *depart = fopen (fileName, "r");
     
    	if (depart != NULL){
     
     
    		FILE *arrivee = fopen (fileNameCreate, "w+");
     
    		if (arrivee != NULL){
     
    			char ligne[TAILLE_MAX] = "";
    			char *ligne2,*tmp;
     
    			while (fgets (ligne, TAILLE_MAX, depart) != NULL){
     
    				tmp=malloc(strlen(ligne)*sizeof(char));
    				strcpy(tmp,ligne);
     
    				int i = 0;
     
    				while((chaineAChercher[i] != NULL) && (chaineARemplacer[i] != NULL)){
     
    					ligne2 = str_replace(tmp,chaineAChercher[i],chaineARemplacer[i]);				
    					if(ligne2 != NULL){
    						tmp = malloc(strlen(ligne2)*sizeof(char));
    						strcpy(tmp,ligne2);
    					}
    					i++;
     
    				}
     
    				fputs(tmp,arrivee);
     
    			}
     
    			fclose (arrivee);
     
    		}else{
    			printf ("ERREUR: Impossible d'ouvrir le fichier: %s.\n",fileNameCreate);
    			ret = EXIT_FAILURE;
    		}
    		fclose (depart);
    	}else{
    		perror (fileName);
    		ret = EXIT_FAILURE;
    	}
    	return ret;
    }
    L'erreur est donc dans la premiere fonction mais je vous met quand meme les 2 si vous voulez tester ouq quoi que ce soit

    MERCIIIII, j'ai vmt besoin de votre aide

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L8O8L Voir le message
    Je vais la mettre au point et je te redis ce que ça a donnée

    Ca marche pas... Changement de code : Voir page suivante MERCI
    Oui, comme je m'en doutais, il y avait une petite correction à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* 'sauter' l'ancien mot */
          p_ligne = p_mot + strlen (text);
    Le code testé :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int search_and_replace (char const *ligne, char *ligne_out,
                            char const *text, char const *textChange)
    {
       int ok = 0;
       /* debut de la chaine a traiter */
       char const *p_ligne = ligne;
       char *p_mot;
     
    /* nettoyage de la chaine de destination */
       strcpy (ligne_out, "");
     
       while ((p_mot = strstr (p_ligne, text)) != NULL)
       {
    /* copier le debut de la ligne */
          strncat (ligne_out, p_ligne, p_mot - p_ligne);
    /* copier le nouveau mot */
          strcat (ligne_out, textChange);
    /* 'sauter' l'ancien mot */
          p_ligne = p_mot + strlen (text);
    /* copier la fin de la ligne */
          strcat (ligne_out, p_ligne);
     
          ok = 1;
       }
       return ok;
    }
     
    int main (void)
    {
     
       char in[] = "Hello wild world";
       char out[128];
     
       int ok = search_and_replace (in, out, "wild", "lovely");
     
       if (ok)
       {
          printf (" in = '%s'\n", in);
          printf ("out = '%s'\n", out);
       }
     
       return 0;
    }
    Il fallait aussi penser à mettre ok à 1 quand on a trouvé au moins un mot...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     in = 'Hello wild world'
    out = 'Hello lovely world'
     
    Press ENTER to continue.
    En fait, ça ne fonctionne pas si il faut remplacer plusieurs mots... L'algorithme est faux. Il va falloir réfléchir un peu plus...

  18. #18
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    Merci mais le truc pour cette fonction c'est qu'il faut que le mot soit séparé dans des espaces. Et moi le mot peut etre vraiment nimporte ou...

    C'est pour ca que j'ai pris une nouvelle fonction

  19. #19
    Membre régulier Avatar de L8O8L
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 148
    Points : 115
    Points
    115
    Par défaut
    je viens de trouver où été l'erreur dans mon bloc mais alors la pourquoi??? j'en sais strictement rien!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // [...]
            Long = (size_t)pos - (size_t)txt;
    	TailleAllouee = Long + strlen (Apres) + 1;
    	TxtRetour = malloc (TailleAllouee); // C'est cette ligne qui change txt... Je ne comprend pas pourquoi
    	PosTxtRetour = 0; 
    // [...]

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Bizarre.
    Mais déjà, tu devrais sûrement changer ton affectation pour Long: La soustraction de pointeur est possible, tu sais...
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    Long = (size_t)(pos - txt); /*soustraction retourne un ptrdiff_t*/

Discussions similaires

  1. copie contenu d'un fichier dans un autre fichier avec sed
    Par zorooo dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 18/01/2010, 09h17
  2. copie de fichier dans un autre repertoire
    Par paul fa dans le forum Langage
    Réponses: 5
    Dernier message: 21/07/2009, 12h00
  3. copier le contenu d'un fichier dans un autre avec séparateur
    Par sws2008 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 03/12/2008, 09h56
  4. Copie d'un tableau dans l'autre avec formule
    Par Pascal26 dans le forum Excel
    Réponses: 2
    Dernier message: 18/01/2008, 10h27
  5. Réponses: 1
    Dernier message: 15/05/2007, 16h55

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