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 :

Ecrire et lire des données en C


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 8
    Points
    8
    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 : 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
    #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 : 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>
    #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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Et attention, le fichier est ouvert deux fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             fichier = fopen("datasin.bin", "r+");
             if ((fichier = fopen("datasin.bin", "wb")) == NULL) {
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 8
    Points
    8
    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 : 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
    #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 : 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
     
    #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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 8
    Points
    8
    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é Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    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
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 8
    Points
    8
    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 éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Laura675 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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, ..., ..., ...) !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Décembre 2012
    Messages : 5
    Points : 8
    Points
    8
    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.

Discussions similaires

  1. [SQL-Server] Ecrire et lire des données Unicode dans MSSQL 2005
    Par kaboume dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 30/09/2010, 08h27
  2. Ecrire et lire des données d'une classe
    Par rtg57 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/04/2010, 19h11
  3. Comment lire des données d'un fichier XML à partir de java
    Par kamaldev dans le forum Format d'échange (XML, JSON...)
    Réponses: 11
    Dernier message: 25/08/2006, 19h29
  4. [Excel] Lire des données de excel avec php
    Par Eisy dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 09/03/2006, 17h00
  5. CFile : comment lire des données
    Par romeo9423 dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2004, 19h10

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