Allouer un fichier de donnée
mouna1985
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis entrain d'écrire un programme qui permet de définir une structure.
Cette structure sera par la suite utilisé pour lire un fichier de donnée ( 4 colonne et 1000 lignes). Par la suite je veux allouer ces données en mémoire pour y travailler par la suite.
le programme est le suivant:
Le code m'affiche de un faux résultat. Quelqu'un peux m'aider à corriger ce programme?
Merci d'avance.
Je suis entrain d'écrire un programme qui permet de définir une structure.
Cette structure sera par la suite utilisé pour lire un fichier de donnée ( 4 colonne et 1000 lignes). Par la suite je veux allouer ces données en mémoire pour y travailler par la suite.
le programme est le suivant:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <malloc.h> #define NUM_IND 4000 #define MAX_lignes 1000 /*definition of the input data structure*/ typedef struct { int Index; int N; float d; float w; }ind_struct; ind_struct *ind_array; int main(void) { FILE *input_data; int i; /*Read the input data file and the test data file*/ input_data=fopen("data.txt","r+"); if (input_data==NULL) { printf("the input data is not ready \n"); } else { printf("the input data is ready \n"); ind_array = (ind_struct *) calloc (NUM_IND, sizeof(ind_struct)); if (ind_array== NULL) nomemory("input"); else { for (i=0; i<MAX_lignes; i++) { fscanf(input_data,"%e",&ind_array[i].Index); fscanf(input_data,"%e",&ind_array[i].N); fscanf(input_data,"%e",&ind_array[i].d); fscanf(input_data,"%e",&ind_array[i].w); printf("%.f %.f %.3E %.3E \n",ind_array[i].Index,ind_array[i].N,ind_array[i].d,ind_array[i].w); } } } return 0; } /*==================================================================== Prints an error message and terminates the program ====================================================================*/ nomemory(string) char *string; { printf("\nmalloc: out of memory making %s!!\n",string); printf("\n Program is halting ....."); exit(-1); }
Le code m'affiche de un faux résultat. Quelqu'un peux m'aider à corriger ce programme?
Merci d'avance.
A voir également:
- Allouer un fichier de donnée
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
2 réponses
Salut mouna1985,
Si tes deux premières colonnes sont des entiers, comme suggéré par ta structure, c'est plutôt comme cela, il me semble :
Voir les spécificateurs là :
http://www.cplusplus.com/reference/cstdio/fscanf/
http://www.cplusplus.com/reference/cstdio/printf/
Dal
Si tes deux premières colonnes sont des entiers, comme suggéré par ta structure, c'est plutôt comme cela, il me semble :
fscanf(input_data,"%d",&ind_array[i].Index); fscanf(input_data,"%d",&ind_array[i].N); fscanf(input_data,"%e",&ind_array[i].d); fscanf(input_data,"%e",&ind_array[i].w); printf("%d %d %.3E %.3E \n",ind_array[i].Index, ind_array[i].N,ind_array[i].d,ind_array[i].w);
Voir les spécificateurs là :
http://www.cplusplus.com/reference/cstdio/fscanf/
http://www.cplusplus.com/reference/cstdio/printf/
Dal
J'ignore quel compilateur tu utilises, mais tu devrais compiler tes programmes avec affichage des avertissements (warnings).
En testant ton code avec le compilateur gcc et l'option -Wall affichant tous les warnings, le compilateur t'indique où se trouvent de potentielles erreurs sous la forme d'avertissements. Ce ne sont pas des erreurs de compilation, mais le compilateur se doute que ce tu fais ne va probablement pas produire le résultat attendu (à moins que tu saches très bien ce que tu fais).
En règle générale, il faut mieux toujours compiler avec les avertissements, comprendre tous les avertissements, et en éliminer la cause (qui dans la quasi totalité des cas est bien une erreur ou en tout cas une incohérence).
Une bonne pratique est aussi de passer sur ton code un programme de type "lint", qui va aller plus loin dans l'analyse statique du code. Sous Linux, il y a aussi Valgrind, qui va analyser l'exécution du code de façon dynamique, utile pour de nombreuses choses, car il est modulaire, mais surtout connu pour la recherche de problèmes liés à la gestion de la mémoire et le profilage.
Dal
En testant ton code avec le compilateur gcc et l'option -Wall affichant tous les warnings, le compilateur t'indique où se trouvent de potentielles erreurs sous la forme d'avertissements. Ce ne sont pas des erreurs de compilation, mais le compilateur se doute que ce tu fais ne va probablement pas produire le résultat attendu (à moins que tu saches très bien ce que tu fais).
En règle générale, il faut mieux toujours compiler avec les avertissements, comprendre tous les avertissements, et en éliminer la cause (qui dans la quasi totalité des cas est bien une erreur ou en tout cas une incohérence).
Une bonne pratique est aussi de passer sur ton code un programme de type "lint", qui va aller plus loin dans l'analyse statique du code. Sous Linux, il y a aussi Valgrind, qui va analyser l'exécution du code de façon dynamique, utile pour de nombreuses choses, car il est modulaire, mais surtout connu pour la recherche de problèmes liés à la gestion de la mémoire et le profilage.
Dal