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

  1. #21
    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
    Merci pour ces explications.
    Mais je ne comprend pas pourquoi il écrit 4 caracteres en sortie alors que l'on a bien spécifier 1. Et pourquoi je ne peux mettre que 1 car sinon j'ai l'erreur d'execution sur la mémoire qui ne peut etre lu.
    Merci
    Je ne comprend pas ce que tu entends par 4 caractères... 4 octets? 4 entiers?

    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++

    +

  2. #22
    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 : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    J'ai peur de comprendre.

    Tu utilises fread pour lire des entiers dans un fichier texte, c'est ça ?
    fread et fwrite sont plutôt faits pour travailler sur des fichiers binaires, sur des octets.

    Si tu veux travailler sur des fichiers texte, utilise plutôt fgets et fprintf.

  3. #23
    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
    oui 4 entier
    Je voulais a l'origine travailler sur un entier a la fois.
    ici dans mon fichier d'entré j'ai une suite 123456789 et en sortie pour une taille d'un int a raison d'une quantité unitaire je recupere 1234

  4. #24
    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
    Et pour travailler sur un fichier binaire et étudié bit apres bit, quel taille doit on rentrer.
    Merci.

  5. #25
    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
    Dans mon fichier d'entrée j'ai une suite nombre et en sortie il écrit 4 chiffres c'est pour cela, si je veux les écrire un par un quel taille dois je alors spécifier?
    merci
    Dans le code que tu as montré, tu ne lis qu'un entier depuis le fichier de sortie et tu n'écris qu'un seul entier dans le fichier de destination.

    Es-tu sur d'avoir un fichier binaire? Si tu a écrit "1234" à l'aide d'un éditeur de texte, tu as en fait un fichier contenant 4 octets correspondant aux code des caractères '1', '2', '3', '4' (en encodage ascii ou latin-1 ou autre).

    Lorsque tu crois lire un entier avec ta fonction fread, tu lis en fait les 4 octets contenus dans ton fichier dans nbo. Ainsi, les 8 bits de poids faible de la variable nbo, qui est type int 32 bits (sur ma machine) la valeur correspondant au caractère '1'. Lorsque tu écris la valeur de nbo sur le flux de sortie, tu copies également les 4 octets contenus dans la variable nbo.

    Si tu désire travailler avec un fichier binaire, il ne faut pas le créer avec un éditeur de texte, mais avec la fonction fwrite.

    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++

    +

  6. #26
    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
    oui 4 entier
    Je voulais a l'origine travailler sur un entier a la fois.
    ici dans mon fichier d'entré j'ai une suite 123456789 et en sortie pour une taille d'un int a raison d'une quantité unitaire je recupere 1234
    Tu as saisi la valeur 123456789 à l'aide d'un éditeur de texte?

    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++

    +

  7. #27
    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 : 47
    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
    oui 4 entier
    Je voulais a l'origine travailler sur un entier a la fois.
    ici dans mon fichier d'entré j'ai une suite 123456789 et en sortie pour une taille d'un int a raison d'une quantité unitaire je recupere 1234
    Ben oui, c'est logique. Un int fait (sur ta machine) la taille de 4 char (qui est l'unité de mesure de taille en C).

    Comme je te l'ai dit juste au dessus, si tu utilises des fichiers texte, il faut appeler fgets et fprintf plutôt que fread et fwrite.

    Un article dont la lecture te sera profitable : http://emmanuel-delahaye.developpez.com/inputs.htm

  8. #28
    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
    oui 4 entier
    Je voulais a l'origine travailler sur un entier a la fois.
    ici dans mon fichier d'entré j'ai une suite 123456789 et en sortie pour une taille d'un int a raison d'une quantité unitaire je recupere 1234
    Tu dois créer ton fichier binaire de la manière suivante:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
     
        int tableau[9] = {1,2,3,4,5,6,7,8,9};
     
        FILE *fichier = fopen("fichier_in", "wb");
        if (fichier_in == NULL)
        {
              fprintf(stderr, "L'ouverture a échoué!\n");
              exit(EXIT_FAILURE);
         }
     
         fwrite(tableau, sizeof(tableau[0]), sizeof(tableau), fichier);
     
         fclose(fichier);
         return EXIT_SUCCESS;
    }
    "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. #29
    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
    Merci
    Si j'ai bien compris lorsque je tape un chiffre dans l'éditeur de texte,
    ce chiffre vaut un octet alors que dans mon programme sa valeur depend du type dans lequel on l'a définit.
    Il est donc impossible d'etre en lecture ecriture texte et de lire seulement un octet dans un fichier.

    Est t il possible de lire un fichier ligne par ligne (donc sans savoir le nbr d'élément de la ligne) ou de terminer la lecture a un moment précis (en binaire)
    Merci de votre aide depuis le début

  10. #30
    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
    Merci
    Si j'ai bien compris lorsque je tape un chiffre dans l'éditeur de texte,
    ce chiffre vaut un octet alors que dans mon programme sa valeur depend du type dans lequel on l'a définit.
    Il est donc impossible d'etre en lecture ecriture texte et de lire seulement un octet dans un fichier.

    Est t il possible de lire un fichier ligne par ligne (donc sans savoir le nbr d'élément de la ligne) ou de terminer la lecture a un moment précis (en binaire)
    Merci de votre aide depuis le début
    Tu peux lire une ligne d'un flux associé à un fichier texte à l'aide de la fonction fgets:

    http://man.developpez.com/man3/fgets.3.php

    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++

    +

  11. #31
    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
    En binaire est il possible de lire un fichier d'arreter la lecture puis de la reprendre au meme endroit qu'on l'a arreter precedemment.
    Y a t il une technique si l'on veut utiliser fread.
    Vice versa si l'on veut faire different fwrite mais sans qui se suivent dans le fichier de sortie

  12. #32
    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 : 47
    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
    Est t il possible de lire un fichier ligne par ligne (donc sans savoir le nbr d'élément de la ligne) ou de terminer la lecture a un moment précis (en binaire)
    Merci de votre aide depuis le début
    En binaire, il n'y a pas de ligne. Il y a des octets.
    Lire "ligne par ligne" n'a de sens que pour un fichier texte.

  13. #33
    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 : 47
    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
    En binaire est il possible de lire un fichier d'arreter la lecture puis de la reprendre au meme endroit qu'on l'a arreter precedemment.
    Y a t il une technique si l'on veut utiliser fread.
    Vice versa si l'on veut faire different fwrite mais sans qui se suivent dans le fichier de sortie
    oui, fseek.

  14. #34
    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
    En binaire est il possible de lire un fichier d'arreter la lecture puis de la reprendre au meme endroit qu'on l'a arreter precedemment.
    Y a t il une technique si l'on veut utiliser fread.
    Vice versa si l'on veut faire different fwrite mais sans qui se suivent dans le fichier de sortie
    Là, je ne comprend plus bien ce que tu veux faire. Le mieux est de faire un choix: tu veux travailler en binaire ou avec des fichiers texte. Ensuite, tu définis un micro-projet qui te servira à expérimenter.

    Peut-être est-il préférable que tu précises exactement ce que tu désires faire afin de recevoir l'aide la plus efficace possible.

    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++

    +

  15. #35
    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 : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par mujigka
    Peut-être est-il préférable que tu précises exactement ce que tu désires faire afin de recevoir l'aide la plus efficace possible.
    +1, parce que là, c'est en train de partir dans tous les sens...

  16. #36
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 ?

  17. #37
    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

  18. #38
    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 : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par sone47
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fread (ptr, sizeof(int), 10, in);
     fwrite (ptr, sizeof(int), 10, out);
    A moins d'etre absolument certain que le fichier inital contient bien au moins 10 elements de la taille specifier, on ne fait pas ce genre de traitement. En effet si le nombre d'elements lisibles dans le fichier est plus petit, les elements surnumeraires auront une valeur quelconque et la taille des deux fichiers sera differentes.
    fread() retournant le nombre d'element reelement lus, on ecrit plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int nb_lu;
     
    nb_lu = fread (ptr, sizeof(int), 10, in);
    fwrite (ptr, sizeof(int), nb_lu, out);

  19. #39
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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 gl
    on ecrit plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int nb_lu;
     
    nb_lu = fread (ptr, sizeof(int), 10, in);
    fwrite (ptr, sizeof(int), nb_lu, out);
    Il faut aussi tester si on a pas une fin de lecture. Avec fread(), c'est un peu tordu...

  20. #40
    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 : 47
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il faut aussi tester si on a pas une fin de lecture. Avec fread(), c'est un peu tordu...
    Qu'entends tu par fin de lecture ? Si tu parles de la fin de fichier, on se retrouve justement dans un cas ou le nombre lu est inferieur au nombre demande, il suffit ensuite eventuellement de faire appel a feof() ou ferror() pour determiner si il s'agit de la fin du fichier ou d'une erreur de lecture.
    Le petit bout de code fournit gere ces deux cas de la meme maniere en copiant le nombre d'elements reelement lus dans le fichier destination.

Discussions similaires

  1. prblme de lecture avec fread ... etrange...
    Par toto4650 dans le forum MFC
    Réponses: 14
    Dernier message: 28/07/2005, 18h58
  2. problème de fread
    Par _ky_ dans le forum C
    Réponses: 6
    Dernier message: 10/09/2004, 15h45
  3. fread et mem
    Par drKzs dans le forum C
    Réponses: 9
    Dernier message: 29/09/2003, 17h17
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 10h21
  5. fwrite et fread
    Par bohemianvirtual dans le forum C
    Réponses: 5
    Dernier message: 05/06/2002, 13h24

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