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: fgetc sur char 26 (=SUB) => EOF :(


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut problème: fgetc sur char 26 (=SUB) => EOF :(
    Bonjour, je perd du temps pour un problème que je n'arrive pas à comprendre, j ai googler en vain sans résultat.... donc je m en remet à vous

    Je travaille sur windows2000 avec Dev-C++.
    C'est pour faire marcher un programme de codage de Huffmann que j'essaie de cerner/corriger ce bug (ce n'est pas important de le savoir)

    Donc le bug c'est lorsque l'on fait fgetc(F) avec F (fichier ouvert en lecture) qui se situe juste avant le char 26 qui est SUB. Normalement, je m'attend à ce que le fgetc(F) renvoie 26... mais hélas il renvoie EOF .
    Il se peut que ce problème n'existe pas avec Unix....
    Quoiqu'il en soit, le code ci-dessous éxécuté chez moi montre qu'à la tentative de lecture du char 26, fgetc renvoie EOF ...
    Donc pourquoi? Comment corriger ce bug ?

    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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    int main (void)
    {
     /* preuve du bug que fgetc renvoie EOF si il doit lire le char 26 (SUB)  :( */
    FILE * F;
    int e;
     
    if ((F = fopen("test.txt","w")) == NULL) printf("erreur d ouverture!\n");
    if (fputc(54,F) == EOF) printf("erreur d ecriture!\n");
    if (fputc(26,F) == EOF) printf("erreur d ecriture!\n");
    if (fputc(52,F) == EOF) printf("erreur d ecriture!\n");
    if (fclose(F) == EOF) printf("erreur de fermeture!\n");
     
    if ((F = fopen("test.txt","r")) == NULL) printf("erreur d ouverture!\n");
    if ((e = fgetc(F)) == EOF) printf("impossible de lire le fichier!\n");
    else printf("caractere lu: int: %d char: %c\n",e,e);
    if ((e = fgetc(F)) == EOF) printf("impossible de lire le fichier!\n"); /* impossible */
    else printf("caractere lu: int: %d char: %c\n",e,e);
    if ((e = fgetc(F)) == EOF) printf("impossible de lire le fichier!\n");
    else printf("caractere lu: int: %d char: %c\n",e,e);
    if (fclose(F) == EOF) printf("erreur de fermeture!\n");
     
    while(1);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    qui à l'éxécution donne:
    caractere lu: int: 54 char: 6
    impossible de lire le fichier!
    impossible de lire le fichier!

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: problème: fgetc sur char 26 (=SUB) => EOF :(
    Citation Envoyé par Sakijep
    Donc le bug c'est lorsque l'on fait fgetc(F) avec F (fichier ouvert en lecture) qui se situe juste avant le char 26 qui est SUB. Normalement, je m'attend à ce que le fgetc(F) renvoie 26... mais hélas il renvoie EOF .
    26 est le code ASCII de ^Z, c'est à dire le caractère marqueur de fin de fichier texte MS-DOS/Windows. Pour qu'il soit ignoré, il faut lire ton fichier en mode binaire "rb").

    http://emmanuel-delahaye.developpez....=Page6#LXXXIII
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    donc ça marcherait sous Linux ?

    Merci beaucoup pour ton lien, je vais devoir comprendre de nouveaux trucs finalement... c est pas plus mal

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bon....
    j'ai lu ton lien et encore d'autres, j ai compris que sous windows les retours à la ligne sont constitués de LF CR (...), ce qui n'est pas le cas sous Unix.

    Il ya un truc que j'ai pas du saisir dans la lecture en mode binaire apparemment parceque je galère ...

    Ou puis je trouver une aide agrémentée d'exemples sous windows (et aussi pkoi pas unix) qui illustrent clairement la difference entre mode binaire ou non ? (lecture et écriture)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Sakijep
    Bon....
    j'ai lu ton lien et encore d'autres, j ai compris que sous windows les retours à la ligne sont constitués de LF CR (...), ce qui n'est pas le cas sous Unix.

    Il ya un truc que j'ai pas du saisir dans la lecture en mode binaire apparemment parceque je galère ...

    Ou puis je trouver une aide agrémentée d'exemples sous windows (et aussi pkoi pas unix) qui illustrent clairement la difference entre mode binaire ou non ? (lecture et écriture)
    Windows : LF puis CR
    Unix : CR puis LF

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Euh, tu es sûr?
    Moi, pour les retours à la ligne, j'ai:
    Windows: CR puis LF
    UNIXoïde: LF seul
    MAC: CR seul
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Alors est-ce normal que sous windows 2000 ce 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
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    int main (void)
    {
    FILE * F;
    int d;
    if ((F = fopen("test.txt","w")) == NULL) printf("erreur d ouverture en ecriture\n");
    if (fputc('\n',F) == EOF) printf("erreur d ecriture\n");
    if (fclose(F) == EOF) printf("erreur de fermeture");
    if ((F = fopen("test.txt","r")) == NULL) printf("erreur d ouverture en lecture\n");
    if ((d = fgetc(F)) != EOF) printf("char 1 :int:%d char:%c",d,d);
    if ((d = fgetc(F)) != EOF) printf("char 2 :int:%d char:%c",d,d);
    if (fclose(F) == EOF) printf("erreur de fermeture");
    while(1);}
    donne a l execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char 1 :int:10 char:
    ?

    Ce qui veut dire que l ecriture du '\n' en mode non binaire dans le fichier se traduit par l ecriture du char 10 (10 = LF) seulement et non pas LF puis CR (ou l inverse CR puis LF)...?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En fait, sous Windows, le fichier aura toujours \r\n (CR-LF) pour les sauts de ligne (en tout cas, si le bloc-notes l'ouvre normalement, c'est le cas)

    Mais quand tu lis le fichier en mode texte, tu ne liras que le \n quel que soit l'OS (Sous Windows, le \r qui le précède sera ignoré, et il me semble que sous Mac, il sera "transformé" en \n)

    De même, si tu écris un fichier en mode texte, le \n que tu écriras sera automatiquement traduit vers le format utilisé par l'OS (Si tu écris un \n en mode texte sous Windows, Windows écrira \r\n à la place)


    Au fait: le programme que tu as posté, écrit le fichier en mode texte puis le lit en mode texte.
    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.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    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
     
    #include<stdio.h>
    #define ECRITURE_BINAIRE 0
    #define LECTURE_BINAIRE 1
     
    int main (void)
    {
    /* Test du mode binaire sous WINDOWS 2000
    ecriture en mode binaire ou non binaire puis lecture en mode binaire ou non binaire
    utilisation pour l ecriture de fputc et pour la lecture fgetc
    Rappel: char: 10 = LF, 13 = CR, 26=SUB=ctrl+c = fin de fichier sous windows >:|
    Saut de ligne sous windows = CR LF. '\n' == 10
     
    - en mode non binaire:
        1) fputc(10,F) écrit 2 chars dans F: 13 et 10...
        2) de même, 2 fgetc(F) sur F pointant sur CR LF ... retournera 10 ... et non 13 10 ...
        3) fgetc(F) sur F pointant sur 26 retournera EOF >:| et le pointeur F ne s'incrémente pas
    - en mode binaire:
        1) fputc(10,F)= écrit simplement 10 dans F
        2) 2 fgetc(F) sur F pointant sur CR LF ... retournera tout bonnement 13 10
        3) fgetc(F) sur F pointant sur 26 retournera 26 >:D et le pointeur F s'incrémente
     
    note:
    En mélangeant les fprintf fscanf fputc fgetc ça donne les même résultats.
    fprintf(F,"%c",10)
    fscanf(F,"%c",&c);
    */
     
        FILE * F;
        char c;
     
        if (ECRITURE_BINAIRE)
        {
            /* Ouverture en mode binaire */
            if ((F = fopen("test.txt","wb")) == NULL) printf("erreur d ouverture en ecriture\n");
        }
        else
        {
            /* Ouverture en mode non binaire */
            if ((F = fopen("test.txt","w")) == NULL) printf("erreur d ouverture en ecriture\n");
        }
        if (fputc(10,F) == EOF) printf("erreur d ecriture\n");
        if (fputc(26,F) == EOF) printf("erreur d ecriture\n");
        if (fclose(F) == EOF) printf("erreur de fermeture");
     
        if (LECTURE_BINAIRE)
        {
            /* lecture en mode binaire */
            if ((F = fopen("test.txt","rb")) == NULL) printf("erreur d ouverture en lecture\n");
        }
        else
        {
            /* lecture en mode non binaire */
            if ((F = fopen("test.txt","r")) == NULL) printf("erreur d ouverture en lecture\n");
        }
        if ((c = fgetc(F)) != EOF) printf("char1:%d " ,c,c);
        if ((c = fgetc(F)) != EOF) printf("char2:%d ",c,c);
        if ((c = fgetc(F)) != EOF) printf("char3:%d ",c,c);
        if (fclose(F) == EOF) printf("erreur de fermeture");
     
    while(1);
    }
     
    /* Resultats: (concorde avec ce que l'on attend)
    ECRITURE_BINAIRE| LECTURE_BINAIRE| Console:
    0               | 0              | char1:10
    0               | 1              | char1:13 char2:10 char3:26
    1               | 0              | char1:10
    1               | 1              | char1:10 char2:26
    */
    Voila j'ai compris maintenant merci encore [/code]

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Problème résolu.

    Mon programme de codage de HUFFMANN marche maintenant sans aucun bugs (autrement dit pour beaucoup de sources y compris celles qui plantaient avant)

    Vive le mode binaire, mais bon, j'aurais souhaité trouver des exemples pédagogiques pour illustrer les subtilités, même si c'était pas nécessaire de tout comprendre... J'aime comprendre correctement qq chose.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    (au fait: Il me semble bien que 26 n'est pas Ctrl-C, mais Ctrl-Z)
    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.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gentil_robot
    Windows : LF puis CR
    Unix : CR puis LF
    Non.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ah, c'est bien ce qui me semblait.

    À vous raconter des bêtises, certains vous feraient douter de vous-même...
    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 éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Points : 1 111
    Points
    1 111
    Par défaut Merci beaucoup


    Grâce à ce message, j'ai pu comprendre pourquoi la lecture de fichier s'interrompait à la lecture de SUB, et j'ai pu rendre mon programme sans BUG.

    Au revoir

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2008, 19h37
  2. Réponses: 21
    Dernier message: 21/11/2005, 09h52
  3. Problème innerHTML sur div !!!
    Par aburner dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/01/2005, 09h23
  4. [CR8] Problème tableau sur plusieurs pages???
    Par christophe28 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/11/2004, 15h46
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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