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 : les paramètres size et nitems


Sujet :

C

  1. #1
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut fread : les paramètres size et nitems
    Bonsoir,

    Je me suis demandé : quelle différence entre fread(tampon, 1, n, fichier) et fread(tampon, n, 1, fichier) ?

    Dans le 1e cas je lis n éléments de 1 octet, et dans le 2e cas je lis 1 élément de n octets, mais quelle différence pour les données que je vais retrouver dans mon tampon ?

    Merci,
    Spootnik

  2. #2
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Bonne Année !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The fwrite function writes up to count items, of size length each, from buffer to the output stream.
    J'ai trouvé ça sur msdn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The fwrite function writes up to count items
    Donc ecrit jusqu'a count Items de taille size chcun, ou count et size sont les 3eme et 2eme parametre respectivement

  3. #3
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Euh.. ce n'est pas ce que je demandais

  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 Spootnik
    Dans le 1e cas je lis n éléments de 1 octet, et dans le 2e cas je lis 1 élément de n octets, mais quelle différence pour les données que je vais retrouver dans mon tampon ?
    Aucune. ( si tout se passe bien c'est la valeur de retour qui sera différente, puisque le nombre de blocs lus est différent )

  5. #5
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Mais quel intérêt d'avoir ce prototype alors ?
    Pourquoi pas simplement :
    size_t fread(void *tampon, size_t n, FILE *fichier);

    tampon est le tampon d'accueil des données, n le nombre d'octets à lire, fichier le fichier et la valeur retournée le nombre d'octets lus.

    ?

    Je veux dire, si au niveau efficacité et données il n'y a pas de différence, pourquoi ce choix sur le nombre de blocs à lire ?

    Est-ce que le résultat est aussi strictement le même en mode binaire ?
    Parce qu'à vrai dire je vois juste un argument contre la deuxième façon (fread(tampon, n, 1, fichier)), c'est que vu qu'il n'y a qu'un seul bloc à lire, c'est du tout ou rien, alors que l'autre façon permet tout de même de lire une partie du fichier.

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    ssmario2 vient de te l'expliquer. Supposons que tu te trouves à deux caractères de la fin de ton fichier et que tu demandes à lire 10 caractères à placer dans buffer. Tu mets donc (bon code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(buffer, sizeof(char), 10, f);
    Tu auras le premier caractère dans buffer[0] et le deuxième dans buffer[1]. Comme deux objets seulement ont été lus, fread retournera 2.

    Si t'as mis cependant (mauvais code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(buffer, 10 * sizeof(char), 1, f);
    fread retournera 0 (ça c'est un échec total ...) car il n'y a plus d'objet de taille égale à 10 * sizeof(char) à lire depuis ta position actuelle et tu n'auras rien de neuf dans buffer.

  7. #7
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Oui c'est ce que je voulais dire par le "tout ou rien".
    Mais justement quel intérêt d'avoir le choix si la deuxième méthode que tu présentes ("mauvais code") n'a que des inconvénients ?

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    Mais justement quel intérêt d'avoir le choix si la deuxième méthode que tu présentes ("mauvais code") n'a que des inconvénients ?
    N'oublions pas que fread() ne sert pas uniquement à lire des char, mais aussi des entiers, des structures, etc.
    Les deux paramètres de fread() permettent donc de donner la taille de l'élément (et donc la taille du type) à lire et le nombre d'élément. Pour pouvoir lire des éléments de n'importe quel type, il est nécessaire[1] d'avoir ces deux informations.


    [1] Il existe bien entendu d'autres solutions, mais toutes ont des avantages et inconvénients. L'utilisation de deux paramètres est un bon choix.

  9. #9
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Donc la deuxième méthode présente l'avantage de pouvoir lire correctement certains types de données ?

    Mais qu'en est-il des structures composées d'éléments de taille différente et enregistrées en binaire alors ?

    Est-ce que le fait de lire par blocs de 1 octet pause problème pour l'interprétation d'un fichier binaire ?

  10. #10
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je parlais de bon et mauvais codes par rapport à ce qu'on voulait faire à savoir lire 10 caractères au plus à partir de la position actuelle. Si on voulait lire un tableau de 10 caractères à partir de cette même position, c'est la deuxième méthode qui est la bonne (on veut 10 caractères ou rien).

    Donc la deuxième méthode présente l'avantage de pouvoir lire correctement certains types de données ?
    Oui . C'est bien ça.

    Mais qu'en est-il des structures composées d'éléments de taille différente et enregistrées en binaire alors ?
    Tu les lis avec la deuxième méthode, je croyais que t'avais enfin compris ...

    Est-ce que le fait de lire par blocs de 1 octet pause problème pour l'interprétation d'un fichier binaire ?
    Ca dépend de ce que tu veux faire. Si tu veux compresser le fichier par exemple, tu t'en fous de ce qu'il contient et tu le considère tout simplement comme une succession d'octets. Si tu sais exactement ce que le fichier contient, tu dois interpréter les données telles qu'elles sont censées être.

  11. #11
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par Melem Voir le message
    Ca dépend de ce que tu veux faire. Si tu veux compresser le fichier par exemple, tu t'en fous de ce qu'il contient et tu le considère tout simplement comme une succession d'octets. Si tu sais exactement ce que le fichier contient, tu dois interpréter les données telles qu'elles sont censées être.
    Mais il n'y a aucune perte d'information ? Par exemple si j'ai un entier sur 4 octets et que je lis par blocs de 2 octets puis que je rassemble ces données, le résultat reste correct ? (cherchez pas à comprendre pourquoi j'ai l'esprit aussi tordu )

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    si j'ai un entier sur 4 octets et que je lis par blocs de 2 octets puis que je rassemble ces données, le résultat reste correct ?
    Oui, mais comme tu viens de le dire, c'est toi qui rassemble ces données. Tu dédouanes donc la fonction de ce travail.

    Il faut se souvenir qu'initialement, un fichier, c'est une boîte à fiches. Les fichiers en informatique portent ce nom car c'était au départ pour conserver ce genre d'information qu'ils ont été inventés. Les fiches étaient matérialisées par des structures de données de taille toujours fixe, qu'on enregistrait consécutivement sur une bande, sans autre forme de balisage.

    Le fait de préciser explicitement au système la taille des éléments lui permet de faire des optimisations éventuelles à la lecture, mais cela sert surtout à garantir au programmeur que les n éléments déclarés comme lus par la fonction le sont réellement et en entier. Une demi-structure en fin de fichier due à des caractères surnuméraires, par exemple, ne sera pas comptabilisée.

  13. #13
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Oui, mais comme tu viens de le dire, c'est toi qui rassemble ces données. Tu dédouanes donc la fonction de ce travail.

    Il faut se souvenir qu'initialement, un fichier, c'est une boîte à fiches. Les fichiers en informatique portent ce nom car c'était au départ pour conserver ce genre d'information qu'ils ont été inventés. Les fiches étaient matérialisées par des structures de données de taille toujours fixe, qu'on enregistrait consécutivement sur une bande, sans autre forme de balisage.

    Le fait de préciser explicitement au système la taille des éléments lui permet de faire des optimisations éventuelles à la lecture, mais cela sert surtout à garantir au programmeur que les n éléments déclarés comme lus par la fonction le sont réellement et en entier. Une demi-structure en fin de fichier due à des caractères surnuméraires, par exemple, ne sera pas comptabilisée.
    Merci beaucoup, c'est très clair comme ça .

    PS: j'aime bien ton avatar ^^

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Citation Envoyé par Spootnik Voir le message
    si j'ai un entier sur 4 octets et que je lis par blocs de 2 octets puis que je rassemble ces données, le résultat reste correct ?
    Oui, mais comme tu viens de le dire, c'est toi qui rassemble ces données. Tu dédouanes donc la fonction de ce travail.

    Il faut se souvenir qu'initialement, un fichier, c'est une boîte à fiches. Les fichiers en informatique portent ce nom car c'était au départ pour conserver ce genre d'information qu'ils ont été inventés. Les fiches étaient matérialisées par des structures de données de taille toujours fixe, qu'on enregistrait consécutivement sur une bande, sans autre forme de balisage.

    Le fait de préciser explicitement au système la taille des éléments lui permet de faire des optimisations éventuelles à la lecture, mais cela sert surtout à garantir au programmeur que les n éléments déclarés comme lus par la fonction le sont réellement et en entier. Une demi-structure en fin de fichier due à des caractères surnuméraires, par exemple, ne sera pas comptabilisée.
    Je me permettrais de rajouter que lire octet par octet puis reconstituer "à la main" les éléments contenus dans le fichier est loin d'être trivial, il faut gérer l'alignement (et donc le padding), l'endianness, et toutes ces autres joyeusetés qui dépendent de l'implémentation.

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    PS: j'aime bien ton avatar ^^
    "I want everybody to meet ..." :-)

    Citation Envoyé par gl Voir le message
    Je me permettrais de rajouter que lire octet par octet puis reconstituer "à la main" les éléments contenus dans le fichier est loin d'être trivial, il faut gérer l'alignement (et donc le padding), l'endianness, et toutes ces autres joyeusetés qui dépendent de l'implémentation.
    +1.

  16. #16
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Citation Envoyé par gl Voir le message
    Je me permettrais de rajouter que lire octet par octet puis reconstituer "à la main" les éléments contenus dans le fichier est loin d'être trivial, il faut gérer l'alignement (et donc le padding), l'endianness, et toutes ces autres joyeusetés qui dépendent de l'implémentation.
    Ah, j'avais cru comprendre qu'il n'y avait pas de problème à ce niveau (c'était justement ça l'objectif de la discussion).. merci pour l'info.

  17. #17
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    Ah, j'avais cru comprendre qu'il n'y avait pas de problème à ce niveau (c'était justement ça l'objectif de la discussion).. merci pour l'info.
    Attention, ceci pose problème lorsque tu veux faire quelque chose de portable. Sinon, ce n'est pas difficile en soi de récupérer à la main les octets un à un et les remettre en ordre sur une même machine.

  18. #18
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Ué mais je vais faire simple. Je vais tout enregistrer avec le même boutisme (ça s'dit ça ? ) et lire en "mode tout ou rien" .

  19. #19
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Spootnik Voir le message
    Ah, j'avais cru comprendre qu'il n'y avait pas de problème à ce niveau (c'était justement ça l'objectif de la discussion).. merci pour l'info.
    Si une structure est enregistré tel quel dans le fichier alors si il y aura un problème lors de la lecture octet par octet et de la recomposition du type.

    Par contre, si les données ont elles-même été écrites octet par octet dans un format fixe et précisément défini alors effectivement il n'y aura pas de problème.
    Mais on sort alors du cadre de la lecture d'un type quelconque dans un fichier pour arriver à de la vrai serialization/deserialization vers un format indépendant de la plate-forme. Ce qui est certes une bonne chose (surtout si le fichier est destiné à être échangé entre différentes plate-formes), mais ne correspond pas tout à fait à la même utilisation.

  20. #20
    Membre émérite Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Par défaut
    Effectivement mon but prochain est de faire de la serialization/deserialization, mais ce n'est plus tout à fait dans le cadre de la discussion .

    Disons que cela concernera un autre module de ma bibliothèque. Pour l'instant je m'occupe juste de lire et écrire des données brutes dans des fichiers.

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

Discussions similaires

  1. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 14h35
  2. [Débutant] Pb avec les paramètres dans lien dynamique
    Par hackwell69 dans le forum Struts 1
    Réponses: 2
    Dernier message: 21/02/2005, 11h33
  3. Changer les paramètres régionaux
    Par STEF_1 dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2004, 15h39
  4. Problème avec les paramètres date BDE/ODBC Oracle/XP Pro
    Par Bloon dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/10/2004, 10h09
  5. Réponses: 4
    Dernier message: 04/07/2003, 19h13

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