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   -
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:

#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:

2 réponses

mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
Merci de me répondre, c'est urgent
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 :

    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
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
0