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 frwrite


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut fread et frwrite
    Bonjour,
    j'aurais voulu avoir une explication détaillée de ces deux fonctions.
    J'ai bien vue la syntaxe mais apres coup je n'arrive pas á la comprendre donc ála réutiliser. Je ne comprend pas la différence avec fgetc ou fscanf et fputc et fprintf. Si quelqu'un avait une explication détaillé sur ces deux fonctions et la différence avec les 4 autres j'en serai reconnaissant.
    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Ce que je ne comprend pas, c'est le premier parametre que l'on doit entrer dans ces deux fonctions, et les deux autres apramatres de taille et de nombre. Si l'on n'a pas la connaissance de ce que contient le fichier d'origine ces paramétres sont ils obligatoire?
    Merci

  3. #3
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    http://man.developpez.com/man3/fread.3.php
    Citation Envoyé par man
    SYNOPSIS
    #include <stdio.h>
    size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream);

    DESCRIPTION
    La fonction fread lit nmemb éléments de données, chacun d'eux représentant size octets de long, depuis le flux pointé par stream, et les stocke à l'emplacement pointé par ptr.
    La fonction fwrite écrit nmemb éléments de données, chacun d'eux représentant size octet de long, dans le flux pointé par stream, après les avoir lus depuis l'emplacement pointé par ptr.
    Ca paraît clair, non ?

    Pour répondre à ta question, comment veux-tu que fread sache combien d'éléments de combien d'octets lire si tu ne le lui indiques pas ?
    Ces informations dépendent de la taille de l'emplacement mémoire pointé par ptr. Or, fread ne peut pas connaître cette taille.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Par défaut réponse a fread et fwrite
    Bonjour
    Le remplissage d'un fichier est réalisé par la répitition de l'appel :

    fwrite(adresse d'un ensemble de blocs d'informations,la taille d'un bloc en octets,le nombre de blocs de cette taille que l'on souhaite transférer dans le fichier,l'adresse de la structure décrivant le fichier)

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<stdio.h>
    main()
    {
    int n;
    FILE *f;
    f=fopen("data","w");
    do
    {printf("donnez un entier: ");
    scanf("%d",&n);
    if (n) fwrite(&n,2,1,f);   /*ou bien if (n) fwrite(&n,sizeof(int),1,f);*/
    }
    while (n);
    fclose(f);
    }
    ou bien on peut expliquer le fwrite de notre exemple tout simplement de la maniere suivante
    *&n c'est l'adresse de la variable qui contient la valeur qu'on veut écrire dans le fichier
    *2 c'est la taille d'un bloc du fichier
    *1 c'est le nombre de blocs a transférer
    *f c'est le nom intérne du fichier
    Notons que le fwrite d'une maniére générale permet de transférer plusieurs blocs consécutifs de meme taille a partir d'une adresse donnée

    La lecture d'un fichier
    se fait par un appel de la fonction fread dont les arguments sont comparables a ceux du fwrite

    et il faut pas oublier que le premier argument des fonctions fread et fwrite est une adresse alors lorsqu'on aura a faire a un tableau , faut utiliser tout simplement son nom sans le faire précéder par l'& tandis qu'avec une structure il faudra utilser l'opérateur & pour en obtenir l'adresse et dans ce dernier cas c préférable d'utiliser l'opérateur sizeof pour déterminer la taille du bloc a écrire ou lire

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Je vous remercie pour ces indications.
    Pour etre plus precis desormais, je vais détaillé mon cas.
    Je désire aller chercher des informations inconnues dans un fichiers.
    Puis les recopié dans un autre fichier apes les avoir transformées.
    Ne connaissant pas ce qu'il y a dans le fichier initial, je ne peux définir le type et le nombre d'élément lu.
    Pour m'entrainé j'ai déja utilisé les fonctions fgetc mais je voudrais désormais utiliser fread.
    Pour ce qui est du &n variable qui contient ce qu'on vient de lire, on réécrit tout au long de la lecture dessus?
    Si on fait suivre un fwrite il faut le faire avant le nouveau fread pour écrire la bonne valeur de &n?
    Merci bcp

  6. #6
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par sone47
    Je désire aller chercher des informations inconnues dans un fichiers.
    Puis les recopié dans un autre fichier apes les avoir transformées.
    Elle consiste en quoi la transformation ?

    Parce que s'il s'agit juste d'une copie de fichier, inutile de se compliquer la vie.
    Tu lis un nombre d'octets quelconque et identique à chaque fois, et tu les écrits dans le nouveau fichier.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Je vous remercie beaucoup car c'est exactement cela que je n'avais pas saisi.

    Maintenant si j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     fread (ptr, sizeof(int), 1, in);
     fwrite (ptr, sizeof(int), 1, out);
    avec dans mon fichier d'entrée une suite d'entiers. Comment ce fait il qu'en sortie je récupére 4 entier alors que j'en ai spécifier qu'un seul.
    Lorsque le fichier d'entrée est lue, les tailles des différents types sont elles différentes?

    Une derniere question est ce que ces taille sont liées avec le mode d'ouverture des fichiers(texte ou binaire)

    Merci

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sone47
    Je vous remercie pour ces indications.
    Pour etre plus precis desormais, je vais détaillé mon cas.
    Je désire aller chercher des informations inconnues dans un fichiers.
    Puis les recopié dans un autre fichier apes les avoir transformées.
    Ne connaissant pas ce qu'il y a dans le fichier initial, je ne peux définir le type et le nombre d'élément lu.
    Pour m'entrainé j'ai déja utilisé les fonctions fgetc mais je voudrais désormais utiliser fread.
    Pour ce qui est du &n variable qui contient ce qu'on vient de lire, on réécrit tout au long de la lecture dessus?
    Si on fait suivre un fwrite il faut le faire avant le nouveau fread pour écrire la bonne valeur de &n?
    Merci bcp
    Bien sûr si tu ne connais rien du fichier que tu lis, ça rend les choses très compliquées, car, si c'est un fichier binaire, il peut contenir n'importe quoi.

    Comment veux-tu appliquer des traitements aux données d'un fichier si tu ne sais pas ce que tu traites?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  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 sone47
    Pour etre plus precis desormais, je vais détaillé mon cas.
    Je désire aller chercher des informations inconnues dans un fichiers.
    WTF ? Si tu ne connais pas la structure du fichier, tu ne va rien pouvoir récupérer du tout (à part une séquence d'octets sans signification particulière).

    On ne programme pas au hasard. Pas de spécifications, pas de code.

    C'est un projet scolaire ? industriel ? personnel ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Bonsoir,
    je vous remercie pour toute l'aide que vous m'avez apporté cette apres midi;
    c'est un projet personnel mais non définit qui me permet de me familiariser avec la manipulation de fichier.
    Au tout début je voulais juste retranscrire un fichier pour voir comment cela fonctionnait et grace a l'aide que j'ai eut sur ce forum j'ai pu a chaque fois rajouter un autre type d'utilisation que je ne comprennais pas.
    Au début je partais d'un fichier texte et désormais je rentre dans un fichiers des valeurs issues d'un tableau. Et je voudrais juste lire ces valeurs(dans le fichier d'entré) les transformer une par une une simple multiplication) et arreter cette lecture écriture lorsqu'il n'y a plus rien a lire.
    Merci

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par sone47
    Ce que je ne comprend pas, c'est le premier parametre que l'on doit entrer dans ces deux fonctions, et les deux autres apramatres de taille et de nombre. Si l'on n'a pas la connaissance de ce que contient le fichier d'origine ces paramétres sont ils obligatoire?
    Merci
    Comme l'a dit zooro, ces paramètres n'ont rien à voir avec le fichier que tu lis, mais avec l'espace mémoire que tu as réservé pour stocker les données en mémoire.

    exemple d'un fichier binaire contenant 10 entiers:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        File *fichier_entiers;
        int buffer[10];
     
        fichier_entiers = fopen("mon_fichier.bin", "rb");
        if (fichier_entiers == NULL){
            fprintf(stderr, "La lecture a échoué!\n");
            exit(EXIT_FAILURE);
        }
     
        /* lit 4x10 octets dans le flux pointé par fichier_entiers et les stocke dans buffer */
        fread(buffer, sizeof(buffer[0]), sizeof(buffer), fichier_entiers);
     
        fclose(fichier_entiers);
     
        return EXIT_SUCCESS;
    }
    Bonne chance et meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. prblme de lecture avec fread ... etrange...
    Par toto4650 dans le forum MFC
    Réponses: 14
    Dernier message: 28/07/2005, 17h58
  2. problème de fread
    Par _ky_ dans le forum C
    Réponses: 6
    Dernier message: 10/09/2004, 14h45
  3. fread et mem
    Par drKzs dans le forum C
    Réponses: 9
    Dernier message: 29/09/2003, 16h17
  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