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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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^^...

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

  9. #9
    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]

  10. #10
    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.

  11. #11
    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]

  12. #12
    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é

+ 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