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 :

Problème avec fputc et fgetc


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut Problème avec fputc et fgetc
    Bonjour à tous !

    J'ai un problème avec fputc et fgetc...

    Le but de mon programme est de ré-écrire un caractère dans un fichier, puis de lire le caractère suivant.

    Mon problème est qu'au moment ou le programme lit le caractère suivant celui qu'il vient de modifier, il modifie aussi ce caractère qu'il est entrain de lire. (Donc non seulement fgetc retourne une valeur fausse, mais en plus il modifie mon fichier, ce que je ne veux certainement pas qu'il fasse...)

    (En revanche, si j'utilise fputc tout seul, tout va très bien, et idem pour fgetc...)

    Ce sera peut être plus clair avec un 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
     
     
       1.
          # include <stdio.h>
       2.
          # include <stdlib.h>
       3.
     
       4.
          main()
       5.
          {
       6.
              FILE* fichier = NULL;
       7.
     
       8.
              fichier = fopen("essai.txt", "r+");
       9.
     
      10.
              fputc('F', fichier);
      11.
              printf("caractere lu = %c\n", fgetc(fichier));
      12.
     
      13.
              fclose(fichier);
      14.
          }

    Si dans mon fichier essai.txt j'avais marqué "essai", j'obtiens après exécution de ce code, un "F" à la place du "e" et un caractère bizarre (représenté sous le bloc-notes de Windows par un rectangle vide) à la place du premier "s". (Tout le reste est inchangé)

    En bref, je suis un peu déconcerté par ce problème... Je viens donc ici solliciter votre aide ^^
    Merci d'avance !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Canigou Voir le message
    Bonjour à tous !

    J'ai un problème avec fputc et fgetc...

    Le but de mon programme est de ré-écrire un caractère dans un fichier, puis de lire le caractère suivant.

    Mon problème est qu'au moment ou le programme lit le caractère suivant celui qu'il vient de modifier, il modifie aussi ce caractère qu'il est entrain de lire. (Donc non seulement fgetc retourne une valeur fausse, mais en plus il modifie mon fichier, ce que je ne veux certainement pas qu'il fasse...)

    (En revanche, si j'utilise fputc tout seul, tout va très bien, et idem pour fgetc...)

    Ce sera peut être plus clair avec un 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
     
     
       1.
          # include <stdio.h>
       2.
          # include <stdlib.h>
       3.
     
       4.
          main()
       5.
          {
       6.
              FILE* fichier = NULL;
       7.
     
       8.
              fichier = fopen("essai.txt", "r+");
       9.
     
      10.
              fputc('F', fichier);
      11.
              printf("caractere lu = %c\n", fgetc(fichier));
      12.
     
      13.
              fclose(fichier);
      14.
          }

    Si dans mon fichier essai.txt j'avais marqué "essai", j'obtiens après exécution de ce code, un "F" à la place du "e" et un caractère bizarre (représenté sous le bloc-notes de Windows par un rectangle vide) à la place du premier "s". (Tout le reste est inchangé)

    En bref, je suis un peu déconcerté par ce problème... Je viens donc ici solliciter votre aide ^^
    Merci d'avance !
    Il me semble avoir lu quelque part sur ce fofo que les opérations de lecture/écriture sur un même fichier (surtout dans le domaine Windows) étaient sensibles et nécessitaient de passer par un fseek() intermédiaire. J'ai pas vérifié ce fait mais tu peux essayer...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Sve@r a tout à fait raison, regarde ici, le paragaphe sur "r+" et autre.
    fais simplement ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              fputc('F', fichier);
           fflush(fichier);
              printf("caractere lu = %c\n", fgetc(fichier));
    et tout ira bien !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    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 Sve@r
    Il me semble avoir lu quelque part sur ce fofo que les opérations de lecture/écriture sur un même fichier (surtout dans le domaine Windows) étaient sensibles et nécessitaient de passer par un fseek() intermédiaire. J'ai pas vérifié ce fait mais tu peux essayer...
    Exactement ! et j'en sais quelque chose ( toute une après-midi pour comprendre....mais bon je ne suis pas prêt de l'oublier c'est clair )

    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
    # include <stdio.h>
    # include <stdlib.h>
    int main()
    {
        FILE* fichier = NULL;
        fichier = fopen("essai.txt", "r+");
     
        if( fichier != NULL )
        {
    	fputc('F', fichier);
    	fflush( fichier ); 
    	printf("caractere lu = %c\n",fgetc( fichier ));
        }
        fclose(fichier);
     
        return 0;
    }

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    grillé
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Aie... J'avais bien vu que rajouter fseek(fichier, 0, SEEK_CUR) résolvait mon problème... mais il faut avouer que c'est pas génial comme solution ...

    Le programme sur lequel je planche actuellement aura à utiliser cette combinaison "fputc-fgetc" de manière récurrente, donc je n'ai guère envie de rajouter une opération (normalement) inutile a chaque fois...

    De plus, je n'ai pas arrêté de voir sur internet que la fonction fseek pouvait créer des problèmes lorsqu'elle était utilisée sur des fichiers en mode texte, je préfèrerai donc ne pas l'utiliser...

    Ceci dit... si c'est la seule solution je ferai comme ça

    Mais il n'y a vraiment pas d'autre moyen ???

    (en tout cas, merci d'avoir répondu !)

  7. #7
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    http://publications.gbdirect.co.uk/c...nd_output.html

    Files opened for update (‘+’ as the second or third character of mode) may be both read and written, but a read may not immediately follow a write, or a write follow a read, without an intervening call to one (or more) of fflush, fseek, fsetpos or rewind. The only exception is that a write may immediately follow a read if EOF was read.
    Au passage il est conseillé de vérifier que les pointeurs données par fopen() sont valides et d'éviter les définitions contractées comme "main() {}".

    Edit : ultra grillé

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Par défaut
    Merci aussi pour les 2 autres réponses qui sont arrivées pendant que j'écrivais mon précédent message^^...

  9. #9
    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
    Grillades à volonté !!!!

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Canigou Voir le message
    Aie... J'avais bien vu que rajouter fseek(fichier, 0, SEEK_CUR) résolvait mon problème... mais il faut avouer que c'est pas génial comme solution ...
    Boaf si un simple fflush() suffit...

    Citation Envoyé par Canigou Voir le message
    De plus, je n'ai pas arrêté de voir sur internet que la fonction fseek pouvait créer des problèmes lorsqu'elle était utilisée sur des fichiers en mode texte, je préfèrerai donc ne pas l'utiliser...
    Ben c'est un petit peu le problème du C sous zindow. Comme ce n'est pas un langage natif de ce système (au contraire du C sous Unix), il a fallu implémenter la conversion. Et il est possible que certains détails aient été oubliés ou négligés. Déjà rien que le fait de devoir distinguer "fichier texte" et "fichier non texte" est significatif de la complexité et la lourdeur de ce système...

    Citation Envoyé par ssmario2 Voir le message
    Grillades à volonté !!!!
    zerguem pour tous !!!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben c'est un petit peu le problème du C sous zindow. Comme ce n'est pas un langage natif de ce système (au contraire du C sous Unix), il a fallu implémenter la conversion. Et il est possible que certains détails aient été oubliés ou négligés. Déjà rien que le fait de devoir distinguer "fichier texte" et "fichier non texte" est significatif de la complexité et la lourdeur de ce système...
    Quel est le rapport avec Windows ? Ce sont des comportements qui font partie de la norme.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dapounet Voir le message
    Quel est le rapport avec Windows ? Ce sont des comportements qui font partie de la norme.
    Ca fait partie de la norme d'avoir des problèmes avec fseek() ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    D'après ce que j'ai lu sur ce même forum, oui: Pour les fichiers texte, la norme ne garantit le fonctionnement de fseek() qu'avec un offset nul ou un offset retourné par ftell().

    De plus, je tiens à vous rappeler qu'avant MacOS X, les mac eux aussi faisaient la différence entre fichier texte et fichier binaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    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 Sve@r
    Ca fait partie de la norme d'avoir des problèmes avec fseek() ???
    Malheureusement je pense que oui :
    Citation Envoyé par §7.19.5.4 / ISO/IEC 9899:TC2 / WG14/N1124
    6 - When a file is opened with update mode ('+' as the second or third character in the
    above list of mode argument values), both input and output may be performed on the
    associated stream. However, output shall not be directly followed by input without an
    intervening call to the fflush function or to a file positioning function (fseek,
    fsetpos, or rewind), and input shall not be directly followed by output without an
    intervening call to a file positioning function, unless the input operation encounters endof-
    file. Opening (or creating) a text file with update mode may instead open (or create) a
    binary stream in some implementations.

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    De plus, je tiens à vous rappeler qu'avant MacOS X, les mac eux aussi faisaient la différence entre fichier texte et fichier binaire...
    Unix (officiellement né en 1970) ne l'a jamais faite...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problèmes avec fgetc et fgets
    Par Bruno.C dans le forum Débuter
    Réponses: 3
    Dernier message: 04/07/2009, 16h24
  2. problème avec feof et fgetc
    Par the_boss003 dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2009, 13h58
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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