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 :

modification d'un fichier texte


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut modification d'un fichier texte
    Bonsoir,

    j'essaie depuis un moment de créer une fonction qui ouvre un fichier texte, change certain caractére comme le é en e ou le à en a....
    Mais voila, j'ai toujours des messages d'erreurs:

    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
    void remplacerPonctuationEtCaractereAccentue(char *stockageFichier);
    //void remplacerMinusculeEnMajuscule();
     
    int main(int argc, const char * argv[])
    {
        char stockageFichierModifie[10000];                             //on créé un tableau qui va acceuillir le fichier modifié
        char *pointeurSurStockageFichierModifie=&stockageFichierModifie; //on créé le pointeur vers ce tableau
     
        remplacerPonctuationEtCaractereAccentue(pointeurSurStockageFichierModifie);        // on lance la fonction pour remplacer la
    }
     
    void remplacerPonctuationEtCaractereAccentue(char *stockageFichier)
    {
        int i = 0,j=0;
        char caractereAAnalyser=0;
        const char chaineUn='é',chaineDeux='è',chaineTrois='à',chaineQuatre='ç',chaineCinq='â',chaineSix='ê',chaineSept=',',chaineHuit=' ';
        FILE *fichier = NULL;
        fichier=fopen("/Users/programmation/Documents/modifier fichier liste mot/modifier fichier liste mot/listemot.txt", "r");
     
     
        do {
            i++;
            caractereAAnalyser=fgetc(fichier);
        if (strcmp(&chaineUn, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='e';
        }
        else if (strcmp(&chaineDeux, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='e';
        }
        else if (strcmp(&chaineTrois, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='a';
        }
        else if (strcmp(&chaineQuatre, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='c';
        }
        else if (strcmp(&chaineCinq, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='a';
        }
        else if (strcmp(&chaineSix, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='e';
        }
        else if (strcmp(&chaineSept, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='';
        }
        else if (strcmp(&chaineHuit, &caractereAAnalyser) == 0)
        {
            stockageFichier[i]='';
        }
            else
            {
                stockageFichier[i]=caractereAAnalyser;
            }
            } while (caractereAAnalyser != EOF);
    }
    et voici les messages d'erreurs que j'obtiens:



    Je ne comprend pas ce que veut dire l'erreur de la ligne 16.
    Ligne 50 et 54, le but est de remplacer une virgule par un renvoie à la ligne et un espace par rien. Ca j'ai aussi des difficultés pour y arriver.


    Si une âme charitable peut me venir en aide je lui en serait éternellement reconnaissant

  2. #2
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    Pour l'erreur c'est fort probablement à cause de l'unicode. Souvent avec l'encodage unicode, les caractères sont représentés sur plus de 8 bits.

    Niveau des avertissements, le type stockageFichier[n] est de type caractères et non pointeur. stockageFichier est un pointeur sur caractère mais ce qui est pointé est de type caractère. Au pire met le à zéro.


  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Regarde du côté des wchar pour manipuler des caractères accentués.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char chaineUn='é',chaineDeux='è',chaineTrois='à',chaineQuatre='ç',chaineCinq='â',chaineSix='ê',chaineSept=',',chaineHuit=' ';
    Argh !
    Pour commencer, ce ne sont pas des chaines mais des caractères. Ensuite, ça me donne envie de gifler des gens quand je vois des variables nommées comme ça ! Comment dans le code peux-tu savoir (une fois que la définition n'est plus visible) que chaineCinq est un à. Pour ne pas appeler ces constantes CAR_E_GRAVE, CAR_A_CIRCONFLEXE, etc ?

    char stockageFichierModifie[10000];Ce n'est pas très compliqué de déterminer la taille du tableau, tu ne devrais pas utiliser une taille en dur (à terme en tout cas ; au début, pourquoi pas).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *pointeurSurStockageFichierModifie=&stockageFichierModifie; //on créé le pointeur vers ce tableau
    pointeurSur ? Tu peux simplement mettre un préfixe p, c'est une convention que tous les développeurs comprendront.

    En revanche, cette ligne en elle-même montre que tu n'as pas compris comment passer un tableau à une fonction ! Je te conseille de lire cet article : http://gradot.wordpress.com/2012/08/08/de-la-difference-entre-tableaux-et-pointeurs-en-c/

    De plus, mon compilateur émet un warning sur cette ligne. Le tien non ? Quel IDE / compilateur utilises-tu (serait-ce Qt Creator ?)

    Il faut vérifier que le fichier a étécorrectement ouvert avant de travailler dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcmp(&chaineHuit, &caractereAAnalyser)
    Je deviens très très dubitatif sur la validité de ce code. Sais-tu comment est définie une chaine de caractères en C ? Si non, regarde la FAQ la rubrique cours et tutoriels, tu trouveras plein d'informations. Si oui, crois-tu qu'il y a nécessairement un '\0' terminal ici ?

    Le code que tu donnes et ta capture d'écran ne sont pas cohérents. Passons.
    La solution est simplement de ne pas écrire le caractère dans ton tableau

  4. #4
    Membre averti
    Homme Profil pro
    assistant informatique
    Inscrit en
    Mai 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : assistant informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mai 2013
    Messages : 27
    Par défaut
    Hello,

    tout d'abord merci d'avoir passer du temps pour analyser mon code (tout pourri).

    Regarde du côté des wchar pour manipuler des caractères accentués.
    En fait, je suis en train d'apprendre à programmer en C avec un cours sur internet. Dans ce cours je dois réaliser un pendu pour mettre en pratique les connaissances apprises.
    Pour créer ce pendu je me créer un fichier texte où sont rangé tous les mots récolter sur des listes de mot en vrac récupéré sur le net (donc non formaté pour mon code de pendu). C'est pour cela que j'ai voulu faire ce code et que je ne connaissais pas encore les wchar.

    Pour commencer, ce ne sont pas des chaines mais des caractères. Ensuite, ça me donne envie de gifler des gens quand je vois des variables nommées comme ça ! Comment dans le code peux-tu savoir (une fois que la définition n'est plus visible) que chaineCinq est un à. Pour ne pas appeler ces constantes CAR_E_GRAVE, CAR_A_CIRCONFLEXE, etc ?
    Effectivement, je n'ai pas encore pris les bonnes habitudes. Je reste encore figé "petit code" et ne me projète pas encore sur des codes énormes. Merci du conseil.

    pointeurSur ? Tu peux simplement mettre un préfixe p, c'est une convention que tous les développeurs comprendront.

    En revanche, cette ligne en elle-même montre que tu n'as pas compris comment passer un tableau à une fonction !
    Je suis allez voir ton lien donc effectivement, c'est plus simple que ce que j'avais mis.

    De plus, mon compilateur émet un warning sur cette ligne. Le tien non ? Quel IDE / compilateur utilises-tu (serait-ce Qt Creator ?)
    Je suis sur XCode. Mon compilateur m'avait affiché un warning à cette ligne mais en refaisant une compilation juste avant de faire la capture d'écran ce warning a disparu (certainement noyé sous un tas d'autres avertissement ).

    Il faut vérifier que le fichier a été correctement ouvert avant de travailler dessus
    Corrigé.

    Je deviens très très dubitatif sur la validité de ce code. Sais-tu comment est définie une chaine de caractères en C ? Si non, regarde la FAQ la rubrique cours et tutoriels, tu trouveras plein d'informations. Si oui, crois-tu qu'il y a nécessairement un '\0' terminal ici ?
    Je ne suis pas sûr d'avoir compris pleinement cette remarque. Toutefois en retirant les & je n'ai plus d'avertissement.


    Voilà où en est mon code pour le moment:

    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
    void remplacerPonctuationEtCaractereAccentue(wchar_t *stockageFichier);
    //void remplacerMinusculeEnMajuscule();
     
    int main(int argc, const char * argv[])
    {
        wchar_t stockageFichierModifie[10000]; //on créé un tableau qui va acceuillir le fichier modifié
    //    char *pStockageFichierModifie=&stockageFichierModifie; //on créé le pointeur vers ce tableau
     
        remplacerPonctuationEtCaractereAccentue(stockageFichierModifie);  // on lance la fonction pour remplacer la
        printf("%ls",stockageFichierModifie);
    }
     
    void remplacerPonctuationEtCaractereAccentue(wchar_t *stockageFichier)
    {
        int i = 0;
        wchar_t caractereAAnalyser[]={L'a'};
        wchar_t carEAigu[]={L'é'},carEGrave[]={L'è'},carAGrave[]={L'à'},carCCedile[]={L'ç'},carACirconflexe[]={L'â'},carECirconflexe[]={L'ê'},carVirgule[]={L','},carEspace[]={L' '};
        FILE *fichier = NULL;
        fichier=fopen("/Users/programmation/Documents/modifier fichier liste mot/modifier fichier liste mot/listemot.txt", "r");
     
        if (fichier != NULL)//on teste si le fichier est bien ouvert
        {
     
        do {    //boucle qui va analyser les caracteres du fichier un à un jusqu'à ce qu'il rencontre \0
            i++;
            fgetws(caractereAAnalyser, 1, fichier);//on prend une lettre du fichier
        if (wcscmp(carEAigu, caractereAAnalyser) == 0)//si le caractere du fichier est un é alors on stocke un e dans stockageFichier[i]
        {
            stockageFichier[i]='e';
        }
        else if (wcscmp(carEGrave, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='e';
        }
        else if (wcscmp(carAGrave, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='a';
        }
        else if (wcscmp(carCCedile, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='c';
        }
        else if (wcscmp(carACirconflexe, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='a';
        }
        else if (wcscmp(carECirconflexe, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='e';
        }
        else if (wcscmp(carVirgule, caractereAAnalyser) == 0)
        {
            stockageFichier[i]='\r';
        }
        else if (wcscmp(carEspace, caractereAAnalyser) == 0)
        {
        }
            else
            {
    //            printf("%s",caractereAAnalyser);
                stockageFichier[i]=caractereAAnalyser;
            }
            } while (caractereAAnalyser != WEOF);
        }
    }
    Ca donne une compilation avec 3 erreurs finales :



    Je retourne à la recherche d'infos au sujet de ces erreurs.
    Pour le reste je vais me pencher sur l'allocation dynamique pour stockageFichierModifie.

    Bon week end.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je pense que ton problème est que tu n'as pas complètement compris comment est défini une chaîne de caractères en C. On ne peut pas t'en vouloir, c'est l'un des poins les plus compliqués du C. D'ailleurs, tu as bien dit que tu n'avais pas pleinement compris une de mes remarques à ce sujet

    Tu fais des comparaisons de chaines (strcmp) alors que tu cherches à comparer deux caractères. On ne fait pas de fgets() de taille 1 : on fait fgtec() pour récupérer un caractère.

    Les erreurs indiquées par ton compilateur sont un problème justement à cause du fait que tu mélanges char, char[], char* (idem si tu rajoutes un w partout).

    Il faut que tu sois plus clair sur ces points pour faire un code correct.

Discussions similaires

  1. [AIDE] modification d'un fichier texte
    Par babap1 dans le forum C++
    Réponses: 6
    Dernier message: 16/01/2008, 11h49
  2. Réponses: 50
    Dernier message: 19/10/2007, 23h38
  3. modification d'un fichier texte
    Par didy59 dans le forum C
    Réponses: 2
    Dernier message: 25/11/2006, 11h38
  4. Modification d'un fichier texte
    Par velo83 dans le forum C
    Réponses: 14
    Dernier message: 21/05/2006, 07h28
  5. Réponses: 4
    Dernier message: 21/04/2006, 21h55

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