Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 12 sur 12
  1. #1
    Invité régulier
    Femme Profil pro Laura
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Nom : Femme Laura

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2012
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Ecrire et lire des données en C

    Bonjour!
    Dans le but de tester des fonctions de traitements du signal, je voulais générer un fichier de donnée, l'enregistrer, puis le réouvrir et tester mes fonctions dessus.
    Mais je ne parviens pas à faire cela correctement, je crois que j'ai vraiment besoin de lumière sur ce qui est écrit et ce qui est lu, car le C est assez nouveau pour moi et j'ai encore du mal à savoir ce que je manipule.
    Après avoir épluchés plusieurs discussions, il m'a semblé qu'il était plus facile d'écrire en binaire, mais je suis ouverte à d'autre suggestion

    Mon code pour générer mon fichier de données est le suivant:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <stdlib.h>
    #include <fftw3.h>
    #include <math.h>
     
    int main()
         {
             double in[1000]={0};
             int i=0;
             for (i=0; i<1001;i++)
             {
                 in[i]=sin(i)+2*sin(i*2);
             }
     
                FILE* fichier = NULL;
             fichier = fopen("datasin.bin", "r+");
             if ((fichier = fopen("datasin.bin", "wb")) == NULL) {
             fprintf(stderr, "Echec à l'ouverture");
             return(-1);}
             fwrite(&in, sizeof(double), 1001, fichier);
             fclose(fichier);
      return 0;
    }
    Datasin.bin est effectivement créé et est non vide, quand je l'ouvre avec un éditeur de texte il y a un blocs de caractères "^+™ÐG@‰æÐ|Vã¿ÒÚ…ÞÆ» ..." donc je suppose que j'ai bien écrit en binaire dedans.

    Ensuite j'essaye d'ouvrir ce fichier et de le lire, pour cela mon code est:

    Code :
    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>
    #include <fftw3.h>
    #include <math.h>
     
    int main()
         {  
             int i=0;
             double in1[1000]={0};
             FILE* fichier = NULL;
             if ((fichier = fopen("datasin.bin", "rb")) == NULL) {
             fprintf(stderr, "Echec à l'ouverture");
             return(-1);}
                 for (i=0; i<1001;i++)
        {
             fscanf(fichier,"%f",&in1[i]);
             printf("%f\n",in1[i]);
        }
        fclose(fichier);
      return 0;
    }
    Ce qui me chagrine c'est que le printf ne m'affiche que des 0.000 ...

    Pouvez vous m'aider à diagnostiquer d'où vient le problème?

    Merci à tous et bonnes fêtes

  2. #2
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 455
    Points : 12 794
    Points
    12 794

    Par défaut

    Bonjour,
    D'après le man l'option "b" de fopen est désormais ignoré.

    Citation Envoyé par http://man.developpez.com/man3/fopen.3.php
    La chaîne mode peut également inclure la lettre ``b'' comme 3ème caractere, ou même entre les deux caractères d'une des séquences à 2 lettres vues ci-dessus. Ce mode sert uniquement à assurer la compatibilité avec ANSI X3.159-1989 (``ANSI C'') et n'a aucun effet. Le ``b'' est ignoré sur tous les systèmes compatibles POSIX, y compris Linux. (D'autres systèmes peuvent traiter les fichiers de texte et les fichiers binaires différement, et l'ajout du ``b'' peut être une bonne idée si vous faites des entrées-sorties binaires et que votre programme risque d'être porté sur un environnement non-Unix).
    Je pense donc que pour lire/écrire en binaire, il vaut mieux utiliser fread et fwrite.

  3. #3
    Responsable Modération
    Avatar de diogene
    Homme Profil pro Patrick Gonord
    Enseignant Chercheur
    Inscrit en
    juin 2005
    Messages
    5 665
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrick Gonord
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2005
    Messages : 5 665
    Points : 12 545
    Points
    12 545

    Par défaut

    fscanf() est utilisé pour lire des données formatées (donc si les doubles étaient écrits en texte dans le fichier) , pas des données binaires. Se tourner vers fread().
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 254
    Points : 395
    Points
    395

    Par défaut

    Et attention, le fichier est ouvert deux fois:

    Code :
    1
    2
             fichier = fopen("datasin.bin", "r+");
             if ((fichier = fopen("datasin.bin", "wb")) == NULL) {

  5. #5
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 174
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 4 174
    Points : 8 007
    Points
    8 007

    Par défaut

    Citation Envoyé par Laura675 Voir le message
    Bonjour!
    Salut
    Citation Envoyé par Laura675 Voir le message
    Mon code pour générer mon fichier de données est le suivant:
    Code :
    1
    2
    3
    ...
             fwrite(&in, sizeof(double), 1001, fichier);
    ...
    Datasin.bin est effectivement créé et est non vide, quand je l'ouvre avec un éditeur de texte il y a un blocs de caractères "^+™ÐG@‰æÐ|Vã¿ÒÚ…ÞÆ» ..." donc je suppose que j'ai bien écrit en binaire dedans.
    Mouais. Tu peux l'ouvrir avec un éditeur hexa et tu verras mieux. Mais étant donné que tu as utilisé fwrite() pour écrire, te faudra utiliser son équivalent pour lire => fread()

    Citation Envoyé par Neckara Voir le message
    Bonjour,
    D'après le man l'option "b" de fopen est désormais ignoré.
    Uniquement sur des systèmes types posix...
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers, 1931

  6. #6
    Invité régulier
    Femme Profil pro Laura
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Nom : Femme Laura

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2012
    Messages : 5
    Points : 6
    Points
    6

    Par défaut

    Bonjour,

    Merci pour vos réponses ! j'ai donc utilisé fread, par contre je n'arrive pas à passer à l'interieur d'une fonction? Quand j'execute:


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <stdlib.h>
    #define NUM 10
    int main()
         {
            double in[NUM]={0};
    	int i=0;
             FILE* fichier = NULL;
             if ((fichier = fopen("datasin.bin", "rb")) == NULL) {
             fprintf(stderr, "Echec à l'ouverture");
             return(-1);}
             fread(&in, sizeof(double), NUM, fichier);
    		 		for (i=0; i<NUM;i++)
        {
             printf("%f\n",in[i]);
        }
        fclose(fichier);
      return 0;
    }

    cela fonctionne, mais en revanche :

    Code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define NUM 10
    void readDatasin(double *in)
    {
             FILE* fichier = NULL;
    		 int i=0;
             if ((fichier = fopen("datasin.bin", "rb")) == NULL) {
             fprintf(stderr, "Echec à l'ouverture");
             return(-1);}
             fread(&in, sizeof(double), NUM, fichier);
    		 		for (i=0; i<NUM;i++)
        {
             printf("%f\n",in[i]);
        }
     
        fclose(fichier);
    }
     
    int main()
         {
            double in[NUM]={0};
            readDatasin(in);
     
      return 0;
    }

    Lorsque le printf est exécuté dans la fonction, une erreur indique "Exception non gérée à 0x0041174e dans ced.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000." comme si a un endroit j'avais confondu adresse et valeur?

    Pouvez vous m'expliquer ce que j'ai fait d'incorrect? Merci pour votre aide!

  7. #7
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 455
    Points : 12 794
    Points
    12 794

    Par défaut

    Bonjour,

    Tout d'abord fread retourne quelque chose, il serait bien de vérifier sa valeur de retour.
    Ensuite, ton tableau est in1 et non in.

    Sinon essaye de faire attention à l'indentation pour garder un code lisible.

  8. #8
    Invité régulier
    Femme Profil pro Laura
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Nom : Femme Laura

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2012
    Messages : 5
    Points : 6
    Points
    6

    Par défaut

    le in1 était une erreur de ma part en copiant le code ici, j'avais remplacé les in1 par des in pour rendre le code un peu plus lisible; dans mon programme les déclarations sont cohérentes;
    J'ai regardé la valeur sortie par fread, elle est égale au nombre de lignes de mon fichier (dans les deux cas, dans le main comme dans la fonction) donc n'indique pas d'erreur.
    Bon j'ai essayé en entrant directement in et non &in dans la fonction et ça fonctionne a présent, mais du coup la question que je me pose est maintenant "pourquoi est ce que avec &in cela fonctionnait?"

  9. #9
    Expert Confirmé Sénior Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    août 2004
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : août 2004
    Messages : 2 287
    Points : 4 391
    Points
    4 391

    Par défaut

    Citation Envoyé par Laura675 Voir le message
    Bon j'ai essayé en entrant directement in et non &in dans la fonction et ça fonctionne a présent, mais du coup la question que je me pose est maintenant "pourquoi est ce que avec &in cela fonctionnait?"
    in et &in sont des adresses, donc ça ne gêne pas fread dans sont exécution. Par contre, fread a stocké le résultat à l'adresse de in au lieu de le stocker dans in. Donc, les données n'ont pas été stockée là où tu le voulais.

  10. #10
    Invité régulier
    Femme Profil pro Laura
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Nom : Femme Laura

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2012
    Messages : 5
    Points : 6
    Points
    6

    Par défaut

    Citation Envoyé par fregolo52 Voir le message
    in et &in sont des adresses, donc ça ne gêne pas fread dans sont exécution. Par contre, fread a stocké le résultat à l'adresse de in au lieu de le stocker dans in. Donc, les données n'ont pas été stockée là où tu le voulais.
    je comprends
    Merci! Bonne année à tous

    Laura

  11. #11
    Expert Confirmé Sénior
    Avatar de Sve@r
    Homme Profil pro Frédéric
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    4 174
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric
    Âge : 45
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 4 174
    Points : 8 007
    Points
    8 007

    Par défaut

    Citation Envoyé par Laura675 Voir le message
    Code :
    1
    2
    3
    4
    5
    6
    7
    void readDatasin(double *in)
    {
         ...
         fread(&in, sizeof(double), NUM, fichier);
         ...
    }
    Pouvez vous m'expliquer ce que j'ai fait d'incorrect? Merci pour votre aide!
    Bonjour

    fread a besoin de recevoir l'adresse de la variable où il devra stocker ses valeurs. Or in est déjà une adresse donc c'est fread(in, ..., ..., ...) et non fread(&in, ..., ..., ...) !!!
    Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
    Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
    Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
    Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
    Dr. Adrian Rogers, 1931

  12. #12
    Invité régulier
    Femme Profil pro Laura
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Nom : Femme Laura

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2012
    Messages : 5
    Points : 6
    Points
    6

    Par défaut

    Citation Envoyé par Sve@r Voir le message
    Bonjour

    fread a besoin de recevoir l'adresse de la variable où il devra stocker ses valeurs. Or in est déjà une adresse donc c'est fread(in, ..., ..., ...) et non fread(&in, ..., ..., ...) !!!
    yep c'est bon on m'a expliqué plus haut

    merci

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •