Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/12/2012, 10h31   #1
Laura675
Invité régulier
 
Femme Laura
Étudiant
Inscription : 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
Laura675 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/12/2012, 13h04   #2
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 840
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 840
Points : 8 629
Points : 8 629
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 17h05   #3
diogene
Responsable Modération
 
Avatar de diogene
 
Homme Patrick Gonord
Enseignant Chercheur
Inscription : juin 2005
Messages : 5 489
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 489
Points : 13 127
Points : 13 127
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 !
diogene est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/01/2013, 21h28   #4
edgarjacobs
Membre éclairé
 
Homme
Développeur informatique
Inscription : mai 2011
Messages : 206
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 53
Localisation : Belgique

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2011
Messages : 206
Points : 326
Points : 326
Et attention, le fichier est ouvert deux fois:

Code :
1
2
         fichier = fopen("datasin.bin", "r+");
         if ((fichier = fopen("datasin.bin", "wb")) == NULL) {
edgarjacobs est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 01/01/2013, 23h08   #5
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 534
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 : 3 534
Points : 7 065
Points : 7 065
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 08h01   #6
Laura675
Invité régulier
 
Femme Laura
Étudiant
Inscription : 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
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!
Laura675 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 10h06   #7
Neckara
Rédacteur/Modérateur

 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 840
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 840
Points : 8 629
Points : 8 629
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 10h25   #8
Laura675
Invité régulier
 
Femme Laura
Étudiant
Inscription : 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
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?"
Laura675 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 10h32   #9
fregolo52
Expert Confirmé Sénior
 
Avatar de fregolo52
 
Homme
Développeur C
Inscription : août 2004
Messages : 2 095
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur C

Informations forums :
Inscription : août 2004
Messages : 2 095
Points : 4 102
Points : 4 102
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.
fregolo52 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 10h42   #10
Laura675
Invité régulier
 
Femme Laura
Étudiant
Inscription : 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
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
Laura675 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h32   #11
Sve@r
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 534
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 : 3 534
Points : 7 065
Points : 7 065
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
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h37   #12
Laura675
Invité régulier
 
Femme Laura
Étudiant
Inscription : 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
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
Laura675 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h11.


 
 
 
 
Partenaires

Hébergement Web