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 :

Lecture d'un fichier Binaire


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Points : 46
    Points
    46
    Par défaut Lecture d'un fichier Binaire
    Salut

    J'aimerai pouvoir lire les data d'un fichier binaires.
    Ce fichier contient les valeurs d'un sinus (sinus cree avec matlab).
    Je sais qu'il faut utiliser la fct fread mais je ne comprends pas comment l'utiliser.
    Ensuite je voudrais recuperer les data pour les mettre dans un vecteur (tableau). Voila le code pr ecrire les valeurs du sinus ds le fichier.
    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
     
    pi=4*atan(1);
     
    x=0:4*pi/100:4*pi;
     
     
    y=sin(x);
     
     
    plot(x,y)
     
    fd=fopen('file.bin','wb');
     
    fwrite(fd,y,'float32');
    fclose(fd)
    Merci pr les suggestions

  2. #2
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Ce qu'il faut surtout, c'est savoir comment Matlab stocke ces valeurs dans le fichier binaire en question (combien de bytes par valeur, ordre relatif des bytes ou endianness). Ensuite, il s'agit d'ouvrir le fichier à l'aide de la fonction de la bibliothèque standard fopen() en mode lecture de fichier binaire "rb"(la distinction entre fichier texte et fichier binaire est importante sous Windows) (http://man.developpez.com/man3/fopen.3.php). La lecture se fait effectivement à l'aide de fread (http://man.developpez.com/man3/fread.3.php). On ferme le fichier avec fclose().

    Thierry

  3. #3
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Points : 46
    Points
    46
    Par défaut
    En faite j'ai utilisé la focntion fread mais lorsque je compile la console apparaite et ensuite j'ai un message comme koi dev va s'arreter. Je ne comprend pas car je n'ai pas d'erreur de compilation. Dans mon code je test d'abord l'ouverture de fichier ensuite je lit les data. De plus normalement les valeurs du fichier matlab sont des float.
    Pouvez vous me dire si ma la fonction fread et bien codé???
    En faite le premier parametre correspond a une variable ou on stock la valeur lu???
    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
     
    int nb
    float i;
     
    fb=fopen("file","rb");
        rewind(fb); // Positionnement en debut de fichier
        /*T*/ /*F*/  if (fb != NULL) // On peut lire dans le fichier binaire
        /*E*/ /*I*/   {
        /*S*/ /*L*/    nb = fread(&i,sizeof(float),101,fb);    
        /*T*/ /*E*/    fclose(fb); // On ferme le fichier binaire qui a été ouvert     
        /*-*/ /*-*/    }
        /*O*/ /*B*/    else // On affiche un message d'erreur 
        /*P*/ /*I*/    {
        /*E*/ /*N*/    printf("Impossible d'ouvrir le fichier file.bin");
        /*N*/ /*-*/    }

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    d'ailleurs, après avoir effectué ce qu'a dit mujigka et si tu connais (tu n'as pas le choix d'ailleurs) le format utilisé, il est possible de lire le tableau d'un seul coup grâce au fread... Et ce pourrait être également le cas si c'était des structures.....

    Mais bien entendu cela dépend entièrement de la manière dont le fichier a été créé...

  5. #5
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Points : 46
    Points
    46
    Par défaut
    peux tu me dire alors comment on fait car moi dans mon cas je lit un par un cbien ca???

    j'aimerais bien pouvoir lire d'un coup et tout mettre dans un tableau.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float i[100];
     
        nb = fread(i,sizeof(float),101,fb);


    (à condition que le fichier ait été écrit 1) sur la même machine(ou en tous cas même OS et même endian) et 2)que Matlab l'ai bien écrit comme ça)..

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float i[100];
     
        nb = fread(i,sizeof(float),101,fb);
    Il faudra m'expliquer comment on passe d'un buffer de 100 à une lecture de 101...

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ok j'ai tapé un peu vite

    milles excuses

  9. #9
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Points : 46
    Points
    46
    Par défaut
    ok merci
    je vais essayer

  10. #10
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    En supposant que Matlab stocke les valeurs sous la formes d'une séquence doubles (ce qui me semble à priori raisonable), et qu'il n'y a pas de problème d'endianess et de bytes d'alignement (i.e. le fichier généré par matlab a été généré sur la même machine)... (ça fait beaucoup de si...). Voici un exemple d'utilisation de fread():
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
    #include <stdlib.h>
     
    #define TAB_SIZE(tab) ((int) (sizeof (tab)/sizeof *(tab)))
     
    int main(void)
    {
        int err = EXIT_SUCCESS;
     
        int i;
        int rc;
        FILE *fp = NULL;
     
        double tableau_in[100];
     
        /* On commence par ouvrir le fichier */
        fp = fopen("file.bin", "rb");
     
        /* Comme toujours, on teste la valeur de retour de fopen() */
     
        if (fp != NULL) /* Ouverture du fichier OK */
        {
            /* On lit les données binaires contenues dans le fichier en supposant
               que chaque valeur est codée sur sizeof(double) bytes, et qu'il n'y
               a pas de problème d'endianness, ni de bytes d'alignement, etc.
     
               Ca fait pas mal de si... */
            rc = fread(tableau_in, sizeof *tableau_in, TAB_SIZE(tableau_in), fp);
     
            /* Si fread() ne renvoie pas TAB_SIZE(tableau_in), soit la fin de
               fichier a été rencontrée, soit une erreur de lecture a eu lieu */
     
            if (rc == TAB_SIZE(tableau_in)) /* Lecture OK */
            {
                for (i = 0; i < TAB_SIZE(tableau_in); ++i)
                {
                    printf("%f ", tableau_in[i]);
                }
                printf("\n");
            }
            else /* feof() est vrai ou ferror() est vrai */
            {
                if (feof(fp) != 0)
                {
                    fprintf(stderr, "la fin de fichier a été recontrée\n");
                    err = EXIT_FAILURE;
                }
                else
                {
                    fprintf(stderr, "Erreur de lecture!\n");
                    err = EXIT_FAILURE;
                }
            }
     
            /* On ferme le fichier une fois qu'on en a plus besoin */
            fclose(fp), fp = NULL;
        }
        else /* Impossible d'ouvrir le fichier */
        {
            fprintf(stderr, "Impossible d'ouvrir le fichier file.bin");
            err = EXIT_FAILURE;
        }
        return err;
    }
    Thierry

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par insa59
    J'aimerai pouvoir lire les data d'un fichier binaires.
    Ce fichier contient les valeurs d'un sinus (sinus cree avec matlab).
    Ca n'a quasiment aucune chance de fonctionner, à moins que tu connaisses précisément le format des données binaires dans le fichier et que tu te lances dans des analyses octets par octets, puis bit à bits... Horriblement compliqué et pas du tout portable.

    Tu devrais plutôt demander à Matlab un enregistrement au format texte (dans un fichier texte), c'est beaucoup plus portable et beaucoup plus simple à traiter.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2006, 13h06
  2. lecture d'un fichier binaire
    Par booby dans le forum C
    Réponses: 17
    Dernier message: 20/09/2006, 16h11
  3. lecture d'un fichier binaire
    Par Tonta dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2006, 06h53
  4. lecture d'un fichier binaire en VB
    Par olivier] dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/12/2005, 11h17
  5. Lecture d'un fichier binaire
    Par Gloubie dans le forum Langage
    Réponses: 9
    Dernier message: 05/12/2005, 12h51

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