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

  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 565
    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 565
    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 565
    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 565
    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 ;

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    j'ai pas très bien compris les remarque par jeroman et ZiGoM@r je pensais les avoirs "résolut" je suis pas un expert en c donc je sais pas trop command faire :/
    dire les erreur c'est bien les corrigé c'est mieux :p
    qu'entends tu par : Compiler ton code pour lister les Warnings ; quand le programme marche il n'y a pas de message de "Warnings" .... ???

  10. #10
    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
    Citation Envoyé par levasseur62 Voir le message
    j'ai pas très bien compris les remarque par jeroman et ZiGoM@r je pensais les avoirs "résolut" je suis pas un expert en c donc je sais pas trop command faire :/
    C'est écrit dans le man : http://man.developpez.com/man3/fgets.3.php
    fgetc() lit le caractère suivant depuis le flux stream et le renvoie sous forme d'un unsigned char, transformé en int, ou EOF en cas d'erreur ou de fin de fichier.
    EOF est une valeur spéciale qui indique une erreur ou une fin de fichier et sa valeur est fixée de telle manière à ce qu'elle ne soit pas confondue avec une valeur "normale" lue par la fonction.
    C'est pour ça que la fonction transforme la valeur unsigned char en int, afin que EOF puisse être renvoyé en cas d'erreur ou de fin de fichier.
    En gros, si EOF est renvoyé, alors il y a une erreur ou une fin de fichier. Si ce n'est pas EOF qui est renvoyé, alors on peut convertir la valeur en unsigned char.

    Le problème, c'est que, comme ta variable est de type char, la valeur retournée par fgetc sera donc convertie en ce type. Par conséquent, si tu effectues le test après la conversion :
    1) si ton char est signé : il existe une valeur (255 en principe) qui sera considérée à tort comme EOF alors qu'aucune erreur ne s'est produite et que que la fin du fichier n'a pas été atteinte.
    2) si ton char est non signé : le test sera toujours vrai.

  11. #11
    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
    Pour éviter la redondance (pas forcement gênante dans ce cas précis) :

    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
                    // caractereActuel = 0
     
    		do
    		{ 
    		    caractereActuel = fgetc(fichier);
     
    			if(remplacer == caractereActuel)
    			{
    				printf("%c" ,remplace);
    				printf("ok");
    				fputc(remplace, fichier2); 			     			  
     
    			} 
    			else
    			{
    		        	fputc(caractereActuel, fichier2);
    			}
    			printf("%c \n " ,caractereActuel);
     
    		} while (caractereActuel != EOF);

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    j'ai remarqué un petit problème
    lorsque dans lol1(fichiertext) il ya : les pomme de terre sont mangé par le chien dans le fichier2 (lol2.txt) et que je lance le prog j'ai ceci les pomme de terre sont mangé par le chien

    j'aimerais avoir é au lieu de é ; et idem lorque je veux changer un caractère par un é j'obtiens Ã,si vous pouvez m'aider , merci d'avance

    ps: la fonction char ascii(char caractereActuel ) ne sert pas à grand chose ....

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void clean_stdin (void);
    char ascii(char ) ;
    int main (void)
    {
            FILE * fichier2 = NULL;
    	FILE * fichier = NULL;
    	char lettre = 0 ;
    	char caractereActuel,remplaceur,remplacant = 0 ;
     
     
     
     
    	printf("entrer la lettre qui va être remplacer dans le fichier") ;
    	scanf("%c", &remplaceur) ; // 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", &remplacant) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer
     
    	printf("%c, %c",remplacant,remplaceur);
    	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);
     
     
    		do
    		{ printf("%c hfghf",caractereActuel);
    			if(remplacant == caractereActuel)
    			{
    				printf("%c" ,remplaceur);
    				printf("ok");
    				fputc(remplaceur, fichier2); 			     			  
     
    			} 
    			else
    			{
    		        	fputc(caractereActuel, fichier2);
    			}
    			printf("%c \n " ,caractereActuel);
    			caractereActuel = fgetc(fichier); //on passe au caractère suivant
    			printf("%c la fonctionestpasser " ,ascii(caractereActuel));		 
    		} while (caractereActuel != EOF) ;
    		fclose(fichier2); //on ferme les deux fichiers(fichier1 et 2 )
    		fclose(fichier);
    	}
     
    	return 0;
    }
    void clean_stdin(void)
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }
     
    char ascii(char caractereActuel )
    {
    	long ascii = 0;
       	char lettre = 0;
    	lettre = caractereActuel ;
    	ascii = lettre ;
            if (ascii <= 10 )
    	{
    	printf("kkkkkk") ;
    	}
    	printf("%ld lafonctionpasse %c " ,ascii,lettre);
    }

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut accents
    Bonjour,
    pour avoir les accents, cela va être un peu plus compliqué parce que c'est de l'ASCII US pour l'instant.
    • remplacer tous vos scanf, et fgetc et fputc et printf par leur équivalent en wchar_t : ce sont ceux qui commencent par w. par exemple wscanf. C'est là que vous pourrez voir les accents.
    • remplacer toutes les déclarations de char au début de la méthode par wchar_t
    • compiler pour voir (il risque d'y avoir des erreurs)
    • tester


    Remarque : Les chaines (les trucs entre "), faut mettre un L devant pour que ce soit du wchar_t.

  14. #14
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    je vais essayer ,
    sinon j'aimerais que l'utilisateur définisse soit même le fichier qu'il veux modifier je vous donne un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    char repertoire[40] ;
    printf("Entrez le fichier à modifier : /n ex : /home/razor/Desktop/lol1.txt ") ;
    fgets(repertoire,40,stdin); 
    fichier = fopen(repertoire, "r"); // ou fichier = fopen("repertoire", "r");
    sauf qu'il trouve pas le fichier :/ et lorsque je fais :
    fichier = fopen("/home/razor/Desktop/lol1.txt", "w");

    sa marche ....

  15. #15
    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
    sauf qu'il trouve pas le fichier :/ et lorsque je fais :
    fichier = fopen("/home/razor/Desktop/lol1.txt", "w");

    sa marche ....
    C'est tout à fait normale, n'oublies pas qu'un fgets() lit aussi le \n généré par l'appuie sur la touche Entrée pour terminer la saisie.

    Citation Envoyé par levasseur62 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char repertoire[40] ;
    <...>
    fgets(repertoire,40,stdin);
    Pourquoi 40 en particulier ? Évite d'utiliser des nombres sortit de nulle part (dans ce cas précis tu peux utiliser PATH_MAX en incluant limits.h puisqu'il me semble que tu es sous un *nix vu le chemin du fichier).

  16. #16
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    salut ssmario2 , je ne connais pas encore toute les "fonction" du c ^^

    comment puis-je faire pour que fgets() ne prenne pas le caractère \n ?
    et utiliser PATH_MAX ?

  17. #17
    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
    comment puis-je faire pour que fgets() ne prenne pas le caractère \n ?
    Il suffit de le rechercher dans la chaine et de le remplacer par un '\0'. Pour faire cette recherche simplement, il y a la fonction strchr : http://man.developpez.com/man3/strchr.3.php

  18. #18
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    lorsque j'execute ce code ci-dessous, et que je tape le répertoire j'obtiens bien "Vous avez tape : '"/home/razor/Desktop/lol1.txt"' " après tout marche le problème dois venir qu'il ne reconnait pas le chemin ou le fichier .....
    je donne la source,la fin n'est pas très important
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    void clean_stdin (void); 
    char ascii(char ) ;
     
    static void purger(void) //je sais pas si cette fonction est nécessaire ....
    {
        int c;
     
        while ((c = getchar()) != '\n' && c != EOF)
        {}
    }
     
    static void clean (char *chaine) //on cherche le caractère \n et on le supprime
    {
        char *p = strchr(chaine, '\n');
     
        if (p)
        {
            *p = 0;
        }
     
        else
        {
            purger();
        }
    }
     
    int main (void)
    {
            FILE * fichier2 = NULL;
    	FILE * fichier = NULL;
    	char lettre = 0 ;
    	char caractereActuel,remplaceur,remplacant = 0 ;
     	int reponse ;
     
    	//printf("Entrez le fichier à modifier : /n ex : "/home/razor/Desktop/lol1.txt") ;
     
     char chaine[31], chaine2[20];
     
        printf("Tapez une phrase : \n");
        fgets(chaine, sizeof chaine, stdin);
        clean(chaine);
        printf("Vous avez tape : '%s'", chaine);
     
     
    	printf("\n Entrez le caractère que vous souhaitez remplacer : ");
            scanf("%c", &remplacant) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer	
    	printf("Entrez par quel autre caractère vous voulez le remplacer :") ;
    	scanf("%c", &remplaceur) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer
     
    	printf(" Valider?\n");
    	printf("oui(1) ou non(2)   :   ");
    	scanf("%d", &reponse); 
     
    	if(reponse == 1)
    	{ 
     
    		fichier = fopen(chaine, "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);
     
     
    			do
    				{ 
    				if(remplacant == caractereActuel)
    				{
    				printf("%c" ,remplaceur);
    				printf("ok");
    				fputc(remplaceur, fichier2); 			     			  
     
    				} 
    				else
    				{
    		        	fputc(caractereActuel, fichier2);
    				}
    				printf("%c \n " ,caractereActuel);
    				caractereActuel = fgetc(fichier); //on passe au caractère suivant
    				//printf("%c la fonctionestpasser " ,ascii(caractereActuel));
     
    			} while (caractereActuel != EOF) ;
     
    		fclose(fichier2); //on ferme les deux fichiers(fichier1 et 2 )
    		fclose(fichier);
    		printf(" Fichier modifié avec succès \n -------------------------------------------------------------------------- \n ");
    	        }
              }
    	  else // si l'utilisateur à appuyé sur la touche 2 alors 
    	  {
     		return 0 ;
    	  }	
     
    }
     
     
    void clean_stdin(void) // fonction qui efface le buffer lors d'une saisie de l'utilisateur
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }

  19. #19
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut
    voici la solution

    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
     #include <stdio.h>
    #include <string.h>
     
    char * saisir_chaine(char * lpBuffer, int buf_size);
    void clean_stdin (void);
    int main()
    {
     
        char remplaceur,remplacant = 0 ;;
        char src[FILENAME_MAX]; /* FILENAME_MAX est defini dans stdio.h */
        FILE * fsrc;
        char dest[FILENAME_MAX];
        FILE * fdest;
     
        printf("Ce programme permet de copier un fichier.\n");
        printf("source : ");
        saisir_chaine(src, sizeof(src));
     
        fsrc = fopen(src, "r");
     
     
            printf("dest : ");
            saisir_chaine(dest, sizeof(dest));
     
             fdest = fopen(dest, "wb");
     
    	printf("\n Entrez le caractère que vous souhaitez remplacer : ");
            scanf("%c", &remplacant) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer	
    	printf("Entrez par quel autre caractère vous voulez le remplacer :") ;
    	scanf("%c", &remplaceur) ; // on récupére la lettre qu'il veut remplacer
    	clean_stdin (); // on vide le buffer
     
                    char c;
     
                    while ((c = getc(fsrc)) != EOF)
     
     
    				if(remplacant == c)
    				{
     
    				   printf("ok");
    				   fputc(remplaceur, fdest);   			  
     
    				} 
    				else
    				{
     
    		        	   putc(c, fdest);
     
    				}
     
     
     
                    fclose(fdest);
                    printf("Copie terminee.\n");
     
            fclose(fsrc);
     
        printf("Merci d'avoir utilise ce programme. A bientot !\n");
     
        return 0;
    }
     
    char * saisir_chaine(char * lpBuffer, int buf_size)
    {
        char * ret = fgets(lpBuffer, buf_size, stdin);
     
        if (ret != NULL)
        {
            char * p = strchr(lpBuffer, '\n');
            if (p != NULL)
                *p = '\0';
            else
            {
                int c;
     
                do
                    c = getchar();
                while (c != EOF && c != '\n');
            }
        }
     
        return ret;
    }
    void clean_stdin(void)
    {
        int c;
     
        do {
            c = getchar();
        } while (c != '\n' && c != EOF);
    }

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/05/2006, 20h55
  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, 17h03

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