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 :

fread et buffer


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Par défaut fread et buffer
    Bonjour,

    Je souhaite ouvrir un fichier .cfg, lire celui-ci jusqua tombé sur le caractère \0.
    J'ouvre le fichier avec fopen

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abc = fopen("12.cfg", "wb");
    et ensuite je voudrait que la chaine de caractère lus soit stockée dans un buffer.

    Merci pour votre aide

    ++

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Oui et alors, quelle est la question, ou le problème ?

    Sinon, l'option "wb" sous fopen je connais pas... Je connais juste "w" et "w+"...

  3. #3
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par Fabllot
    Oui et alors, quelle est la question, ou le problème ?

    Sinon, l'option "wb" sous fopen je connais pas... Je connais juste "w" et "w+"...
    "wb", "rb" etc... 'b' pour binaire ?

    Citation Envoyé par Man.developpez.com
    La chaîne mode peut également inclure la lettre ``b'' comme 3ème caractere, ou même entre les deux caractères d'une des séquences à 2 lettres vues ci-dessus. Ce mode sert uniquement à assurer la compatibilité avec ANSI X3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est ignoré sur tous les systèmes compatibles POSIX, y compris Linux. (D'autres systèmes peuvent traiter les fichiers de texte et les fichiers binaires différement, et l'ajout du ``b'' peut être une bonne idée si vous faites des entrées-sorties binaires et que votre programme risque d'être porté sur un environnement non-Unix).

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Ok, bah je me coucherais moins bête ce soir...
    J'ai l'habitude d'utiliser le man Linux : le "b" n'y est pas indiqué, et pour cause !

  5. #5
    Membre émérite Avatar de Jérémy Lefevre
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Luxembourg

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 898
    Par défaut
    J'ai l'habitude d'utiliser le man Linux : le "b" n'y est pas indiqué, et pour cause !
    c une distinction que l'on fait sous windows et pas sous linux tu ajoute un b ou binarie et t pour texte!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Fabllot
    Sinon, l'option "wb" sous fopen je connais pas... Je connais juste "w" et "w+"...
    Alors ouvre ton livre de C d'urgence...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jerem2000
    c une distinction que l'on fait sous windows et pas sous linux tu ajoute un b ou binarie et t pour texte!
    *** Raisonnement à-la-gomme detected ***

    Et sous Mac OS, VMS, Lynx ou BeOS, tu fais comment ? Il faut arrêter de vivre dans son petit monde fermé...

    Comme l'indique la définition du langage C, on utilise "wb" pour ouvrir un fichier en mode écriture binaire (aka raw ou brute). Point. Rien à voir avec l'OS.

    Quand au "t", vu de la définition du langage C, ça n'existe pas. (c'est une vague extension inutile de certains compilateurs DOS/Windows).

  8. #8
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par Fabllot
    Ok, bah je me coucherais moins bête ce soir...
    J'ai l'habitude d'utiliser le man Linux : le "b" n'y est pas indiqué, et pour cause !
    Page de man provenant de linux-france. C'est vrai que il n'y a pas de reference aux fichiers "binaires", si je puis dire.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stevie Wonder
    Page de man provenant de linux-france. C'est vrai que il n'y a pas de reference aux fichiers binaires.
    Que les choses soient claires. Les pages man sont pratiques, mais ne sont pas la norme.

    Ceci est plus précis (en fait, plus neutre) que les man :
    http://www.dinkumware.com/manuals/de...%20C%20Library

    http://www.dinkumware.com/manuals/de...dio.html#fopen

  10. #10
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Que les choses soient claires. Les pages man sont pratiques, mais ne sont pas la norme.
    J'ai pas dis l'inverse, seulement il parlait des pages man Linux, je montre une page man linux.

    Et puis tes pages, si on est pas anglophone on l'a dans le baba (ce qui n'est pas mon cas).

    Et merci pour les liens, toujours utile.

  11. #11
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    salut

    j'ais retrouvé un vielle exemple ...

    #include <stdio.h>

    int main(void) {
    FILE * fic;
    char chaine1[] = "Première ligne\n";
    char chaine2[] = "C'est un test de ligne de plus de 19 caractères";
    char msg[20];

    /* Ouverture d'un fichier */
    fic = fopen("texte.txt", "w+");

    /* Ecrire deux chaînes dans le fichier */
    fwrite(chaine1, strlen(chaine1), 1, fic);
    fwrite(chaine2, strlen(chaine2), 1, fic);

    /* Se positionner au début du fichier */
    fseek( fic, 0, SEEK_SET);
    /* Lire une ligne dans le fichier, et l'afficher */
    fgets( msg, sizeof(msg), fic);
    printf( "%s", msg);
    /* Lire l'autre ligne, et l'afficher */
    fgets( msg, sizeof(msg), fic);
    printf( "%s", msg);

    /* Pointer au début du fichier, et faire un parcours complet */
    printf("\nParcours complet:\n");
    fseek( fic, 0, SEEK_SET);
    /* Lire les chaînes de caractères */
    while( fgets( msg, sizeof(msg), fic)!=NULL )
    printf("%s", msg);

    fclose(fic);
    putchar('\n');
    return 0;
    }
    Si je me souvien bien, sous win, un saut de ligne = 10,13 alors que sous linux c'est 10 en decimale ... Donc quand tu li t'es fichier : pense y!

    Un site simpa : http://www.lri.fr/~aze/page_c/aide_c/

    En esperant pouvoir t'aider.

    PS : il y a plusieur façon de faire ...
    _________
    Aide toi et dieu t'aidera

  12. #12
    Membre averti Avatar de Stevie Wonder
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Citation Envoyé par CR_Gio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Ecrire deux chaînes dans le fichier */
    fwrite(chaine1, strlen(chaine1), 1, fic);
    fwrite(chaine2, strlen(chaine2), 1, fic);
    c'est pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(chaine1, 1, strlen(chaine1), fic);
    fwrite(chaine2, 1, strlen(chaine2), fic);
    ?

  13. #13
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream);
    effectivement ...

    Mais je li le man et je lit:
    [...] La fonction fwrite écrit nmemb éléments de données, chacun d'eux
    représentant size octet de long,[...]
    ca veux dir que je vais ecrire 1 fois ma chaine. au lieu d'ecrire strlgn fois un octe. Je suis as claire =/

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stevie Wonder
    Et puis tes pages, si on est pas anglophone on l'a dans le baba (ce qui n'est pas mon cas).
    Pas besoin d'être anglophone on est pas dans Star Trek...

    "Computer"
    --"bzzzt"
    "Give me a definition of fopen"
    --"We are the Borgs. Resistance is futile. You will be assimilated"

    Par contre, si on ne sait pas lire l'anglais, on ne fait pas d'informatique. Point.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Stevie Wonder
    c'est pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(chaine1, 1, strlen(chaine1), fic);
    fwrite(chaine2, 1, strlen(chaine2), fic);
    ?
    En l'occurence, l'effet est le même, sauf la valeur de retour

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par CR_Gio
    ca veux dir que je vais ecrire 1 fois ma chaine. au lieu d'ecrire strlgn fois un octe. Je suis as claire =/
    C'est ça, mais ce serait mieux en français. J'ai pas fait option SMS au bac...

  17. #17
    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
    Citation Envoyé par Stevie Wonder
    Page de man provenant de linux-france. C'est vrai que il n'y a pas de reference aux fichiers binaires.
    Citation Envoyé par http://www.linux-france.org/article/man-fr/man3/fopen-3.html
    La chaîne mode peut également inclure la lettre ``b''
    comme 3ème caractere, ou même entre les deux caractères
    d'une des séquences à 2 lettres vues ci-dessus. Ce mode
    sert uniquement à assurer la compatibilité avec ANSI
    C3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est
    ignoré.
    Bon, c'est vrai qu'il n'y a pas de mention "Fichier binaire", mais le b est quand même mentionné. Très mal, d'ailleurs. Je me demande qui est le sagouin qui a tapé cette doc au lieu de nous pondre les oeuvres complètes de Shakespeare comme attendu...

    PS: Dans un fichier binaire, je conseillerais d'écrire le \0 de la chaîne avec celle-ci (strlen()+1)...
    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.

  18. #18
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Par défaut
    j'ai essayer ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *buf[4];
      abc = fopen("12.cfg", "rb");
      fseek(abc, 0, SEEK_SET);
      choix[0] = fgets(buf, sizeof(buf), abc);
      choix[1] = fgets(buf, sizeof(buf), abc);
      choix[2] = fgets(buf, sizeof(buf), abc);
    et mon fichier .cfg ressemble a ceci:

    abcd
    efgh
    ijkl

    mais en sortie, choix[0], choix[1] et choix[2] ont tous la meme valeur soit "ijkl"

  19. #19
    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
    Attends, il faut choisir:
    • Soit tu fais du texte, et tu ouvres ton fichier en mode texte,
    • soit tu fais du binaire, et tu ouvres ton fichier en mode binaire.

    Mélanger lecture de texte et ouverture en mode binaire est à déconseiller (même si ça peut marcher)...

    PS: fgets() retourne l'adresse de buf en cas de succès, donc test 4 choix pointent sur le même buffer.
    Et buf n'est pas du bon type, tu devrais avoir au moins un warning, sinon c'est que tu as mal configuré ton compilateur...
    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.

Discussions similaires

  1. fread, buffer de lecture, feof(fichier)
    Par nicodn02 dans le forum C
    Réponses: 14
    Dernier message: 31/03/2010, 00h55
  2. Problème avec (je suppose) les buffers fread/fwrite
    Par valefor dans le forum Administration système
    Réponses: 0
    Dernier message: 31/10/2008, 14h41
  3. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  4. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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