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 :

"convertisseur" d'une lettre dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut "convertisseur" d'une lettre dans un fichier
    bonjour chère programmeuse et programmeur

    un petit exemple de mon programme, vous allez comprendre ^^

    je rentre la lettre que je vais changer par la lettre que je vais entré ex :

    lol1.txt = le chien mange des pomme de terre

    remplace = t
    remplacer = r

    un deuxieme fichier texte s'ouvre et devrais me faire apparaitre sa :

    le chien mange des pomme de tette (noté le rr de pomme de terre changé par des tt )

    le problème est quand je lance le programme j'obtiens ceci :

    e chien mange des pomme de tette
    ÿ

    il y'a une lettre de bouffer et il rajout un ÿ

    je débute en C ....
    j'éspère avoir été compréhensible et vous remercie d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonjour,

    Montre-nous ton code (encadré par les balises [code] et [/code]).

    Le « ÿ » final, c'est le caractère 255 en ISO-8859-1, soit « -1 » ou encore EOF. Il y a de fortes chances pour que ta boucle soit décalée d'un caractère, ignorant donc le premier et lisant un caractère de trop à la fin (le EOF renvoyé par getchar()).

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    je te passe le code ^^

    voici le 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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void clean_stdin (void);
     
    int main (void)
    {
            FILE * fichier2 = NULL;
    	FILE * fichier = NULL;
    	char lettre = 'A';
    	char caractereActuel = 0 ;
    	char remplace,remplacer = 0 ;
     
     
     
    	printf("entrer la lettre qui va être remplacer dans le fichier") ;
    	scanf("%c", &remplace) ; // on récupére la lettre qu'il veut remplacer
    	printf("entrer la lettre qui va être remplacer dans le fichier");
            clean_stdin (); // on vide le buffer
     
    	scanf("%c", &remplacer) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer
     
    	printf("%c, %c ",remplacer,remplace);
    	fichier = fopen("/home/razor/Desktop/lol1.txt", "r"); // on ouvre le fichier avec comme droit "r" (write)
            fichier2 = fopen("/home/razor/Desktop/lol2.txt", "w");
     
    	if (fichier != NULL)  // on regarde si le fichier existe
    	{
    		caractereActuel = fgetc(fichier);
     
    		while (caractereActuel != EOF)
    		{
    			printf("%c \n " ,caractereActuel);
    			caractereActuel = fgetc(fichier);
     
     
    			if(remplacer == caractereActuel)
    			{
    				printf("%c" ,remplace);
    				printf("ok");
    				fputc(remplace, fichier2); 			     			  
     
    			} 
    			else
    			{
    		        	fputc(caractereActuel, fichier2);
    			}			 
    		}
    		fclose(fichier2);
    		fclose(fichier);
    	}
     
    	return 0;
    }
    void clean_stdin(void)
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    À ta ligne 36, tu lis un nouveau caractère alors que tu n'as pas encore traité le précédent. Cette nouvelle lecture devrait effectivement se faire à l'intérieur de ton while(), mais après le if-else.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 243
    Par défaut
    Tu peux aussi éviter le doublon de "caractereActuel = fgetc(fichier);" en retirant le premier (avant ton while), en maintenant le second en début de boucle et en utilisant do-while.

    "char remplace,remplacer = 0 ;" :
    Je ton conseil d'utilisé des noms (ou des adjectifs) comme "remplacant" et "remplaceur" par exemple.
    "remplacer" est un verbe et si c'est juste une feinte à cause de l'accent, je te conseil d'éviter cette pratique (pense aux futurs lecteurs qui risquent de ne pas comprendre, toi y compris).

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Attention à ça (!!) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char caractereActuel = 0 ;
    
    (...)
    
    caractereActuel = fgetc(fichier);
    		
    while (caractereActuel != EOF)
    {
    
    (...)

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    merci pour vos conseil
    je donne le 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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void clean_stdin (void);
     
    int main (void)
    {
            FILE * fichier2 = NULL;
    	FILE * fichier = NULL;
    	char lettre = 'A';
    	char caractereActuel,remplace,remplacer = 0 ;
     
     
     
     
    	printf("entrer la lettre qui va être remplacer dans le fichier") ;
    	scanf("%c", &remplace) ; // on récupére la lettre qu'il veut remplacer
    	printf("entrer la lettre qui va être remplacer dans le fichier");
            clean_stdin (); // on vide le buffer
     
    	scanf("%c", &remplacer) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer
     
    	printf("%c, %c ",remplacer,remplace);
    	fichier = fopen("/home/razor/Desktop/lol1.txt", "r"); // on ouvre le fichier avec comme droit "r" (write)
            fichier2 = fopen("/home/razor/Desktop/lol2.txt", "w");
     
    	if (fichier != NULL)  // on regarde si le fichier existe
    	{
    		caractereActuel = fgetc(fichier);
     
    		while (caractereActuel != EOF)
    		{ 
    			if(remplacer == caractereActuel)
    			{
    				printf("%c" ,remplace);
    				printf("ok");
    				fputc(remplace, fichier2); 			     			  
     
    			} 
    			else
    			{
    		        	fputc(caractereActuel, fichier2);
    			}
    			printf("%c \n " ,caractereActuel);
    			caractereActuel = fgetc(fichier);			 
    		}
    		fclose(fichier2);
    		fclose(fichier);
    	}
     
    	return 0;
    }
    void clean_stdin(void)
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }
    j'aimerais l'amélioré et savoir si c'est possible .

  8. #8
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par levasseur62 Voir le message
    j'aimerais l'amélioré et savoir si c'est possible .
    Oui c'est possible, commence par:
    • Relir les remarques qui t'ont été déjà faites par jeroman et ZiGoM@r)
    • Compiler ton code pour lister les Warnings

    Puis corriges ton code en conséquence.


    Citation Envoyé par ZiGoM@r Voir le message
    Tu peux aussi éviter le doublon de "caractereActuel = fgetc(fichier);" en retirant le premier (avant ton while), en maintenant le second en début de boucle et en utilisant do-while.
    Il peut garder le while puisque pour le premier tour de boucle la condition est toujours vraie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (caractereActuel != EOF)
    sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char caractereActuel = 0 ;

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/05/2006, 19h55
  2. [PERL] connaitre la position d'une lettre dans un mot
    Par LE NEINDRE dans le forum Langage
    Réponses: 3
    Dernier message: 24/03/2006, 16h03

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