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 mem


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut fread et mem
    slt, g un pt pb de compréhension...
    g lu un exemple de pgmme ds un livre, pour écrire ds un fichier le contenu d'un autre...

    Au début ils allouent une zone de mémoire en utilisant un tableau
    char buff[80] ;
    ...
    ---> ici est-ce que 80 représente le nbre d'octet (80*1) ou bien le nbre d'elmts (80 charactères) ?

    Si je pose cette question, c parqu'ils veulent afficher à l'écran tout ce qui est copié, donc ils ajoutent '\0' à la fin du tablo pour le convertir en chaine...
    buff[80*sizeof(char)]='`\0' ;
    ---> il faut mettre la valeur '\0' ds le dernier elemnt du tableau... instinctivmt le dernier elemt du tableau est buff[80]. Pourkoi multiplier par la taille ? (même si ici la taille vaut 1, elle sera différente pour un entier dc je voudrais comprendre)

    la personne qui a réussit à suivre peut-elle m'expliquer le truc ?

    merci

  2. #2
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut Re: fread et mem
    Citation Envoyé par drKzs
    slt, g un pt pb de compréhension...
    g lu un exemple de pgmme ds un livre, pour écrire ds un fichier le contenu d'un autre...

    Au début ils allouent une zone de mémoire en utilisant un tableau
    char buff[80] ;
    ...
    ---> ici est-ce que 80 représente le nbre d'octet (80*1) ou bien le nbre d'elmts (80 charactères) ?
    le nombre d'éléments (80). le nombre de caractères c'est donc 79.
    Si je pose cette question, c parqu'ils veulent afficher à l'écran tout ce qui est copié, donc ils ajoutent '\0' à la fin du tablo pour le convertir en chaine...
    buff[80*sizeof(char)]='`\0' ;
    ---> il faut mettre la valeur '\0' ds le dernier elemnt du tableau... instinctivmt le dernier elemt du tableau est buff[80]. Pourkoi multiplier par la taille ? (même si ici la taille vaut 1, elle sera différente pour un entier dc je voudrais comprendre)
    Et là je dois bien avouer ma stupéfaction car pour moi, tu as raison et le livre s'est trompé. il ne faut en effet pas multiplier par la taille dans ce cas. DE plus, et là je me demande c'est quoi ce livre, buff[80] n'existe pas puiqu'il n'y a que 80 éléments !!!!! (donc çà va de 0 à 79).

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    ok, c surement une erreur du livre alors car c un exemple simple, il n'y a pas d'autres fonctions dc ds ce cas pas d'autres explication....

    en revanche g mal recopié, il s'agit bien de buff[79*sizeof]


    merci

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    EDIT : attention erroné, voir plus loin

    Salut,
    je pense qu'ils multiplie par la taille de char (==1) juste par habitude :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char buff[80];
    //...
    buff[79*sizeof(char)]=0;
    vous choque ,

    mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double buff[80];
    //...
    buff[79*sizeof(double)]=0;
    vous choque moins !

    oui c'est idiot pour un char, mais pour autre chose, celà ne l'est pas.
    pour être homogène, ils le font aussi sur le char...
    pas si mal ce livre

  5. #5
    Membre émérite
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Par défaut
    Citation Envoyé par hpfx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double buff[80];
    //...
    buff[79*sizeof(double)]=0;
    vous choque moins !

    oui c'est idiot pour un char, mais pour autre chose, celà ne l'est pas.
    pour être homogène, ils le font aussi sur le char...
    pas si mal ce livre
    Moi ca me "choque" tout autant.
    C'est le compilateur qui s'occupe de cela. Tout les compilateurs gere cela maintenant. C'est la moindre des chose.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    je ne comprends plus alors....... il faut considérer que l'on s'occupe du nbr d'elmt ou bien du nombre d'octet ?

    parceque si je veux affecter la valeur '\0' au dernier elmt du tableau, je fais koi ??

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Citation Envoyé par nyal
    Moi ca me "choque" tout autant.
    C'est le compilateur qui s'occupe de cela. Tout les compilateurs gere cela maintenant. C'est la moindre des chose.
    Oui tu as 100% raison, ca me trottais ce soir, je viens de rallumer on PC pour apporter une correction. mea culpa !
    Le compilateur effectue cette tache ..... car buff est de type double... il n'y a pas de soucis, le compilateur le sais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double buff[80];
    buff[79]=0; // OK
    Mais par contre si tu travaille sur un pointeur de type non defini (void) , tu es obligé d'aider le compilo. - oui je sais qu'elle idée de faire du void* ? disons que c'est un cas d'ecole...
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double buff[80];
    void* ptr=&buff;
    ptr[79*sizeof(double)]=0;
    PS : j'en profite pour faire remarquer que '\0' et egal à 0.

  8. #8
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    pour l'erreur du livre, elle n'est pas acceptable puisque buff[79*sizeof(double)] est hors-limites; le fait de le faire avec char est donc illégitime.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Par défaut
    s'il y a écrit ça dans ton bouquin je n'ai qu'un seul conseil :
    jète le ...

    même sur un pointeur tu ne cast pas l'incrément, c'est géré, mais alors sur un tableau, quel horreur !!!

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    ok, merci pour ces éclaircissmt

    et pour le bouquin, pour l'instant c mon seul moyen d'apprentissage, y a ka repérer les coquilles !

    mais heureusmt, il a le forum

    merci à tous

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

Discussions similaires

  1. [linux] differences read & fread
    Par le mage tophinus dans le forum Réseau
    Réponses: 11
    Dernier message: 03/10/2005, 09h57
  2. prblme de lecture avec fread ... etrange...
    Par toto4650 dans le forum MFC
    Réponses: 14
    Dernier message: 28/07/2005, 17h58
  3. problème de fread
    Par _ky_ dans le forum C
    Réponses: 6
    Dernier message: 10/09/2004, 14h45
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. fwrite et fread
    Par bohemianvirtual dans le forum C
    Réponses: 5
    Dernier message: 05/06/2002, 12h24

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