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 :

lire et ecrire sur meme fichier fscanf & fprintf problème


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut lire et ecrire sur meme fichier fscanf & fprintf problème
    Bonjour,
    en langage C je n'arrive pas à lire ET écrire sur le même fichier texte
    j'ouvre avec fopen en a+
    si je fais d'abord le "fscanf", ca lit, mais quand je fais le "fprintf" ca n'écrit pas
    inversement si je fais d'abord le "fprintf", ca écrit, mais quand je fais le "fscanf" ca ne lit pas !
    Alors j'ai pensé à fermer le fichier puis le réouvrir, mais cela ne fonctionne pas => message d'erreur
    que se passe t'il ?
    merci de votre aide
    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
     
    int main() {
     
        int a = 0;
        int b = 0;
    	int c = 0;
     
     
      FILE *fichier = fopen("log.txt", "a+");// tel qu'il est LIT PUIS EVENTUELLEMENT il rajoute
     
      fscanf(fichier,"%d", &c);
        printf("c dans le fichier = %d \n", c);
     
      fprintf (fichier, "Le programme a été ouvert\n");
     
        printf ("Veuillez entrer a :");
        scanf ("%d", &a);
     
        fprintf (fichier, "L'utilisateur a entré la valeur %d pour a\n", a);
     
        printf ("Veuillez entrer b :");
        scanf ("%d", &b);
     
        fprintf (fichier, "L'utilisateur a entré la valeur %d pour b\n", b);
        fprintf (fichier, "La somme de %d et %d est donc %d\n", a, b, a+b);
        fprintf (fichier, "Le programme se termine\n");
     //fscanf(fichier,"%d", &c); // si je fais ce fscanf à la fin, ca ne lit pas !
        //printf("c dans le fichier = %d \n", c);
      //  fclose(fichier);
    //FILE *fichier = fopen("log.txt", "a+");// ca ne marche pas
    	//fichier = fopen("log.txt", "a+");// ca ne marche pas non plus
    //fscanf(fichier,"%d", &c); // si je fais ce fscanf à la fin, ca ne lit pas !
     //   printf("c dans le fichier = %d \n", c);
    	   fclose(fichier);
     //SYSTEM("pause");
     getch();
        return 0;
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luckyalan Voir le message
    que se passe t'il ?
    Bonjour

    Tu ouvres ton fichier en "a+". Le mode "a" est un mode spécial qui place automatiquement ton pointeur en fin de fichier à chaque fois que tu écris.

    Donc tu commences à lire avec fscanf(). Le pointeur est en début de fichier et si le fichier contient une valeur, ton fscanf() lit cette valeur et le pointeur se place après la valeur. Si t'en as une seconde, un nouveau fscanf() te la lira et continuera le déplacement du pointeur.

    Puis tu écris avec fprint(). A ce moment là, quel que soit l'emplacement du pointeur, il est alors placé à la fin et c'est là que tu écris tes éléments (le pointeur se comportant comme un stylo et restant donc toujours positionné après ce qui a été écrit). Et ensuite le pointeur n'est pas repositionné. Il reste à la fin. Il s'ensuit que si tu fais un nouveau fscanf(), tu ne lis rien puisqu'à la fin il n'y a rien à lire.
    Si tu veux retrouver tes éléments écrits, il faut alors que tu mémorises avec ftell() la position du pointeur avant d'écrire puis que tu t'y repositionnes avec fseek() après avoir écrit...
    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
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci Sve@r,
    je suis d'accord avec ce que tu écris, mais cela marche la première fois
    je ferme mon programme et je l'ouvre à nouveau, le fscanf se fait bien, mais rien ne s’écrit dans mon fichier texte qui d'ailleurs garde l'heure de modification de la manip précédente, c'est à dire que la seconde fois que j’exécute mon prog, il ne modifie pas le fichier texte. j'ai bien vérifié qu'il n'était pas encore ouvert dans une fenêtre notepad par exemple, mais non ! et dans ses paramètres, il n'est pas en "lecture seule" !
    je ne comprend pas

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luckyalan Voir le message
    je suis d'accord avec ce que tu écris, mais cela marche la première fois
    je ferme mon programme et je l'ouvre à nouveau, le fscanf se fait bien, mais rien ne s’écrit dans mon fichier texte qui d'ailleurs garde l'heure de modification de la manip précédente, c'est à dire que la seconde fois que j’exécute mon prog, il ne modifie pas le fichier texte. j'ai bien vérifié qu'il n'était pas encore ouvert dans une fenêtre notepad par exemple, mais non ! et dans ses paramètres, il n'est pas en "lecture seule" !
    je ne comprend pas
    Donc t'es sous Windows. Je soupçonne qu'il y a un truc résiduel qui bloque l'accès.
    Quoi qu'il en soit te faut utiliser les outils de vérification. Faut vérifier l'ouverture (s'il y a un soucis alors fopen() renvoie NULL), ainsi que fscanf() et fprintf() (ces deux fonctions renvoient le nombre d'éléments lus/écrits et -1 s'il y a un soucis). Et si ces évènements se produisent, t'as alors errno qui est alors positionné avec une certaine valeur indiquant la cause du soucis et t'as strerror(errno) qui te renvoie le message d'erreur correspondant que tu peux afficher avec printf("%s\n", strerror(errno)).

    Tu peux aussi télécharger unlocker, un petit outil qui t'indique si un fichier est bloqué et par quoi il est bloqué...
    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]

  5. #5
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci Sve@r,
    d'abord oui je suis sur Windows Vista et je code avec visual studio 2010
    j'avoue que les gestions d'erreurs c'est un peu prise de tête pour moi, je ne m'y suis jamais fait.
    bon, ceci dit, j'ai reéssayé en changeant le chemin, et aussi en changeant le mode de fopen, mais rien n'y fait ! chez moi cela écrit la première fois, à la création du fichier et ensuite si je maintiens un fscanf puis un fprintf, à partir du moment ou le fichier est existant ca lit mais ca n'écrit pas.
    j'ai même poussé jusqu'à éteindre et rallumer l'ordi pour vérifier qu'il ne restait pas de trace en mémoire et rien n'y fait
    j'ai aussi désactivé mon antivirus mais rien n'y fait non plus

    NB : mon antivirus bloque le chargement de (http://www.emptyloop.com/unlocker) que tu me propose (logiciel malveillant d'après lui)

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par luckyalan Voir le message
    j'avoue que les gestions d'erreurs c'est un peu prise de tête pour moi, je ne m'y suis jamais fait.
    Oui enfin parfois ça devient incontournable, surtout avec un truc pareil !!!
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE *fichier = fopen("log.txt", "a+");
    if (fichier == NULL)
    {
        printf("Erreur ouverture [%s]\n", strerror(errno));
        return -1;
    }
    C'était si difficile ???

    Pareil avec fprintf => x=fprintf() if (x == -1) ......

    Citation Envoyé par luckyalan Voir le message
    NB : mon antivirus bloque le chargement de (http://www.emptyloop.com/unlocker) que tu me propose (logiciel malveillant d'après lui)
    Mouais. Il en parle dans la faq et le site https://www.virustotal.com le trouve malveillant à 2/55 (3,7%). A toi de voir...
    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]

  7. #7
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci Sve@r, tu m'as appris quelque chose (désolé que mon ignorance t'ai un peu agacée, c'est parce que je suis ignorant que je suis là)
    j'ai mis un contrôle d'erreur sur l'ouverture, fprintf et fclose ! je n'ai aucun retour d'erreur et pourtant ça n'écrit toujours pas
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
     
    int main() {
    	int x = 0;
        int a = 0;
        int b = 0;
    	int c = 0;
     
     
      FILE *fichier = fopen("log2.txt", "a+");// tel qu'il est LIT PUIS EVENTUELLEMENT il rajoute
     if (fichier == NULL)
    {
        printf("Erreur ouverture [%s]\n", strerror(errno));
        return -1;
    }
      fscanf(fichier,"%d", &c);
        printf("c dans le fichier = %d \n", c);
     
      x = fprintf (fichier, "Le programme a été ouvert\n");
      if (x == -1)
    {
        printf("Erreur de fprintf [%s]\n", strerror(errno));
        return -1;
    }
        printf ("Veuillez entrer a :");
        scanf ("%d", &a);
     
        fprintf (fichier, "L'utilisateur a entré la valeur %d pour a\n", a);
     
        printf ("Veuillez entrer b :");
        scanf ("%d", &b);
     
        fprintf (fichier, "L'utilisateur a entré la valeur %d pour b\n", b);
        fprintf (fichier, "La somme de %d et %d est donc %d\n", a, b, a+b);
        fprintf (fichier, "Le programme se termine\n");
     //fscanf(fichier,"%d", &c); // si je fais ce fscanf à la fin, ca ne lit pas !
        //printf("c dans le fichier = %d \n", c);
      //  fclose(fichier);
    //FILE *fichier = fopen("log.txt", "a+");// ca ne marche pas
    	//fichier = fopen("log.txt", "a+");// ca ne marche pas non plus
    //fscanf(fichier,"%d", &c); // si je fais ce fscanf à la fin, ca ne lit pas !
     //   printf("c dans le fichier = %d \n", c);
    	   x=fclose(fichier);
    	   if (x != 0)
    {
        printf("Erreur de fclose [%s]\n", strerror(errno));
        return -1;
    }
     //SYSTEM("pause");
     getch();
        return 0;
     
    }

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Lorsque le mode d'ouverture comporte le '+', on peut lire et écrire mais il y a des contraintes :

    - une écriture ne peut pas être suivie par une lecture sans qu'avant la lecture intervienne un fflush() ou un repositionnement (fseek(), fpos(), ou rewind()).

    - une lecture ne peut pas être suivie par une écriture sans qu'avant l'écriture intervienne un repositionnement à moins que la lecture ait donné un EOF
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    Bonjour Diogene,
    génial, merci ca marche impeccable avec rewind()
    je marque "résolu"
    merci à toi

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    - une écriture ne peut pas être suivie par une lecture sans qu'avant la lecture intervienne un fflush() ou un repositionnement (fseek(), fpos(), ou rewind()).
    D'autant plus que le mode "a" fait que toute écriture place le pointeur en fin de fichier, si on veut lire faut alors le replacer là où il y a des trucs à lire (on en revient alors à mon premier post)...

    Citation Envoyé par diogene Voir le message
    - une lecture ne peut pas être suivie par une écriture sans qu'avant l'écriture intervienne un repositionnement à moins que la lecture ait donné un EOF
    Pourtant son code initial fonctionnait (je lisais puis j'écrivais) sans me reposisionner. Mais faut dire aussi que Linux est souvent un peu permissif avec certaines contraintes qu'on pourrait qualifier de "chiantes". Mais moi aussi j'ai appris un truc (si un jour je dois coder pour du zindow...)

    Citation Envoyé par luckyalan Voir le message
    ca marche impeccable avec rewind()
    Gaffe que rewind() te replace au début du fichier. C'est pas forcément ce que tu voudras faire à chaque fois.
    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. [WD17] lire et ecrire sur un fichier hyperfile55 avec windev 17
    Par karim15 dans le forum WinDev
    Réponses: 3
    Dernier message: 11/10/2014, 09h34
  2. Lire/Ecrire sur un fichier d'un autre disque
    Par gabrielS dans le forum Débuter
    Réponses: 1
    Dernier message: 16/07/2013, 16h35
  3. Lire et ecrire sur un fichier texte à distant.
    Par bazit dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/04/2010, 13h18
  4. lire ecrire sur un fichier Excel
    Par mrkinfo dans le forum C#
    Réponses: 3
    Dernier message: 17/09/2008, 12h01
  5. lire et ecrire sur un fichier Text
    Par touf213 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/07/2007, 22h33

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