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 :

remplacer un caractere dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut remplacer un caractere dans un fichier
    voila je suis entrain de lire un fichier texte dont je veux utiliser les données.

    le probleme c'est que c'est ecrit en francais donc les nombres décimaux s ecrivent avec des virgules et non pas des points comme il faudrait pour le compilateur

    alors j'ai ecris ca que je place en début de programme, juste aprés l ouverture du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while(!feof(file))
        {
            l = fgetc(file);
     
    		if(l ==',')
    		{
    			// efface le caractere "l"
    			fprintf(file, ".");
    		}
    	}
    J'ai pensé a ouvrire le fichier de facon tel que les nouvelles ecritures ecrasent automatiquement les données du fichier et a utilisé la fonction fseek pour revenir 1 case en arriere... Mais fseek se place a une position absolut et non pas relative.

    Donc je ne sais pas comment faire.
    Que faut il que je mette?

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut Re: remplacer un caractere dans un fichier
    Citation Envoyé par ickis
    J'ai pensé a ouvrire le fichier de facon tel que les nouvelles ecritures ecrasent automatiquement les données du fichier et a utilisé la fonction fseek pour revenir 1 case en arriere... Mais fseek se place a une position absolut et non pas relative.
    Le fonctionnement de fseek depend de l'origine (3eme parametre) que tu utilise, avec SEEK_CUR, le deplacement se fait a partir de la position actuelle.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    donc j'ai ecris comme ca:
    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
     
     
     
    	FILE *file; 
    	file = fopen("a.txt","r+");
     
    	while(!feof(file))
        {
            l = fgetc(file);
     
    		if(l ==',')
    		{
    			fseek(file,-1,SEEK_CUR);
    			fprintf(file, ".");
    		}
    	}
    mais ca ne marche pas, le programme bug & le fichier txt est alliéné et pese plusieurs dizaines de mega...

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Je viens d'essayer le petit bout de code et ca fonctionne.

    Il doit avoir un probleme ailleurs.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    ok et merci pour le SEEK_CUR que je ne connaissais pas du tout.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    eh ben non en fait, j'ai essayer pas mal de trucs & rien ne marche, le fichier s aliene, le texte a l interieur se duplique a l infini alors que le code ne l enregistre pas & ne l'ecrit pas etc...

    help plz


    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
     
    #include <stdio.h>
    #include <conio.h> 
     
    int l;
     
    void main () 
    { 
       FILE *file; 
       file = fopen("a.txt","r+"); 
     
       while(!feof(file)) 
        { 
            l = fgetc(file); 
     
          if(l ==',') 
          { 
             fseek(file,-1,SEEK_CUR); 
             fprintf(file, "."); 
          } 
       }
       fclose(file);
     
    	getch (); 
     
    }

  7. #7
    Membre régulier
    Avatar de epeios
    Homme Profil pro
    Ingénieur logiciel
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur logiciel

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 82
    Points
    82
    Billets dans le blog
    2
    Par défaut
    Pout autant que je me souvienne, les fonctions 'fgetc', 'fseek' et 'fprintf' sont susceptibles de retourner un code d'erreur. Ca ne serait peut-être pas une mauvaise chose de tester les valeurs retournées par ces fonctions pour vérifier si l'une d'elle ne retourne pas un des ces codes d'erreur ...

  8. #8
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Salut,

    Je n'ai aucun problème chez moi avec ce code.
    Si le fichier et dupliqué beaucoup de fois ça peut venir d'une mauvaise détection de la fin du fichier.
    Tu peux essayer d'afficher les caractères au fur et à mesure du traitement avec une fonction de ralentissement pour voir où le prog commence à merder.

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Salut,

    ça doit effectivement etre une erreur de détection de fin de fichier. Je n'aime pas beaucoup feof (qui a besoin d'etre précédée d'une instruction de lecture avant d'être executé).

    2 solutions qui permettent de mesurer la taille d'un fichier et donc de s'arrêter au bon moment :
    - avec fseek et ftell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *pf;
    int l;
     
    pf = fopen("a.txt","r+");
    fseek(pf,0,SEEK_END);
    l = ftell(pf);
    ...
    - avec les fonctions de bas niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <io.h>
     
    FILE *pf;
    int l;
     
    pf = fopen("a.txt","r+");
    l = filelength(pf->fd);
    ...
    Tibo

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    désolé mais je comprends pas trop vos solutions...

    je suis toujours au 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
    #include <stdio.h> 
    #include <conio.h> 
     
    int l; 
     
    void main () 
    { 
       FILE *file; 
       file = fopen("a.txt","r+"); 
     
       while(!feof(file)) 
        { 
            l = fgetc(file); 
     
          if(l ==',') 
          { 
             fseek(file,-1,SEEK_CUR); 
             fprintf(file, "."); 
          } 
       } 
       fclose(file); 
     
       getch (); 
     
    }
    avec le MSDEV 97 5.0, le fichier a.txt contient le texte "bonjour, aurevoir" et ca marche pas...

    le programme se lance mais ne s arrete pas, donc je l arrete avec ctrl+alt+surp et alors le fichier a.txt contient "bonjour.onjour.onjour.onjour.onjour.onjour.onjour.onjour.onjour.onjour.onjour.onjour ... ..."

    help plz

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    c'est bon ce code la marche, j'ai enfin trouvé... grace a de l intuition, pas a de la logique!

    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 <stdio.h> 
    #include <conio.h> 
     
    int l; 
     
    void main () 
    { 
       FILE *file; 
       file = fopen("a.txt","r+"); 
     
     
       while(!feof(file)) 
        { 
            l = fgetc(file); 
     
          if(l ==',') 
          { 
             fseek(file,-1,SEEK_CUR); 
             fprintf(file, "."); 
    		 fseek(file,1,SEEK_CUR); 
          } 
       } 
       fclose(file); 
     
       getch (); 
     
    }
    Qqn peut essayer d expliquer?

  12. #12
    Membre régulier
    Avatar de epeios
    Homme Profil pro
    Ingénieur logiciel
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur logiciel

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 82
    Points
    82
    Billets dans le blog
    2
    Par défaut
    Trouvé sur google, à propos de la fonction 'fopen()' :
    When a file is opened with update mode (+ as the second or third character in the mode argument), both input and output may be performed on the associated stream. However, output must not be directly followed by input without an intervening call to fflush() or to a file positioning function (.Fn fseek , fsetpos() or rewind()), and input must not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.
    C'est visiblement un problème de cache. Ce n'est sans doute pas le même qui est utilisé en sortie et en entrée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. remplacer chaine de caractere dans un fichier
    Par Sapache dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 28/09/2007, 17h12
  2. Réponses: 34
    Dernier message: 08/03/2007, 14h51
  3. Remplacer une chaîne de caractères dans un fichier .hex
    Par subsix dans le forum Assembleur
    Réponses: 8
    Dernier message: 23/11/2006, 21h06
  4. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  5. Réponses: 17
    Dernier message: 12/04/2005, 15h28

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