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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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