Probleme de lecture de fichier en c

Fermé
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009 - 7 mars 2009 à 15:09
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 - 8 mars 2009 à 12:39
Bonjour,
j'ai un soucis je dois récupérer des données d'un fichier , je récupere bien des données, mais ça ne correspond pas (nombres différents du fichier d'origine)


le fichier contient des lignes de 30 nombres réels (de 6 à 7 chiffres aprés la virgule à plus de 4000)

le but étant ensuite de les rentrer dans un réseau de neurone ensuite (donc des valeurs comprises entre 0 et 1)

j'ai normalisé un fichier avec open office, quand j'ouvre avec gedit j'ai bien les valeurs voulues

maintenant quand j'ouvre ce fichier (ou un autre d'ailleur) avec mon programme j'obtient bien des nombres réels mais rien à voir avec les données du début


ça fait super longtemps que j'ai pas programmé, j'aurais du finir le programme complet il y a deux heures :'(

#include <stdio.h>
#include <stdlib.h>
#include "floatfann.h"

// version v1.2.0 de FANN 
// compile : gcc use25654.c -o use -lm -lfann
// Documentations :  http://leenissen.dk/fann/fann_1_2_0/index.html


int main()
{
	fann_type *calc_out; // fann type <=> float
	fann_type input[381][30];
	struct fann *ann = fann_create_from_file("cancer25654.net");
	char ligne[11401];
	float val;
	FILE * cas_a_traiter;
	
	int tpap =0; // test pas à pas (je sais pas utiliser le débugger de gcc :'(
	int i=0,j=0,a;


//printf("tpap=24");


if ((cas_a_traiter=fopen("cas_a_traiter.txt", "r"))==0) printf("erreur d'ouverture");
	while(fgets(ligne,12000,cas_a_traiter))
	{
//printf("tpap=29 entrée dans la lecture");
		for(j=0;j<=29;j++)
		{	

			fgets(ligne,sizeof(ligne),cas_a_traiter);
			sscanf(ligne,"%f",&val);
			input[i][j]=(fann_type) val;

		}


		i++;
	
	}
	//j'affiche les données recueillies pour controle
	for(i=0;i<=5;i++)
	{
	printf("\nligne n°= %d ", i);
		for(j=0;j<=29;j++)
		{
		printf("%f ", input[i][j]);
		
		}
//printf("tpap=57");
//scanf("%d",&a); 
	}

//1 

	fclose(cas_a_traiter);
	return 0;
}





quelques exemples de lignes non traitées à lire (fichier final de 800 lignes environ:
11.06 14.83 70.31 378.2 0.07741 0.04768 0.02712 0.007246 0.1535 0.06214 0.1855 0.6881 1.263 12.98 0.004259 0.01469 0.0194 0.004168 0.01191 0.003537 12.68 20.35 80.79 496.7 0.112 0.1879 0.2079 0.05556 0.259 0.09158

14.26 19.65 97.83 629.9 0.07837 0.2233 0.3003 0.07798 0.1704 0.07769 0.3628 1.49 3.399 29.25 0.005298 0.07446 0.1435 0.02292 0.02566 0.01298 15.3 23.73 107 709 0.08949 0.4193 0.6783 0.1505 0.2398 0.1082

12.45 15.7 82.57 477.1 0.1278 0.17 0.1578 0.08089 0.2087 0.07613 0.3345 0.8902 2.217 27.19 0.00751 0.03345 0.03672 0.01137 0.02165 0.005082 15.47 23.75 103.4 741.6 0.1791 0.5249 0.5355 0.1741 0.3985 0.1244

17.14 16.4 116 912.7 0.1186 0.2276 0.2229 0.1401 0.304 0.07413 1.046 0.976 7.276 111.4 0.008029 0.03799 0.03732 0.02397 0.02308 0.007444 22.25 21.4 152.4 1461 0.1545 0.3949 0.3853 0.255 0.4066 0.1059

19.73 19.82 130.7 1206 0.1062 0.1849 0.2417 0.0974 0.1733 0.06697 0.7661 0.78 4.115 92.81 0.008482 0.05057 0.068 0.01971 0.01467 0.007259 25.28 25.59 159.8 1933 0.171 0.5955 0.8489 0.2507 0.2749 0.1297

20.47 20.67 134.7 1299 0.09156 0.1313 0.1523 0.1015 0.2166 0.05419 0.8336 1.736 5.168 100.4 0.004938 0.03089 0.04093 0.01699 0.02816 0.002719 23.23 27.15 152 1645 0.1097 0.2534 0.3092 0.1613 0.322 0.06386



alors je n'arrive pas à voir mon code indenté, alors pour ceux qui ont le même probleme:


le même code:


#include <stdio.h>
#include <stdlib.h>
#include "floatfann.h"

// version v1.2.0 de FANN
// compile : gcc use25654.c -o use -lm -lfann
// Documentations : http://leenissen.dk/fann/fann_1_2_0/index.html


int main()
{
fann_type *calc_out; // fann type <=> float
fann_type input[381][30];
struct fann *ann = fann_create_from_file("cancer25654.net");
char ligne[11401];
float val;
FILE * cas_a_traiter;

int tpap =0; // test pas à pas (je sais pas utiliser le débugger de gcc :'(
int i=0,j=0,a;


//printf("tpap=24");


if ((cas_a_traiter=fopen("cas_a_traiter.txt", "r"))==0) printf("erreur d'ouverture");
while(fgets(ligne,12000,cas_a_traiter))
{
//printf("tpap=29 entrée dans la lecture");
for(j=0;j<=29;j++)
{

fgets(ligne,sizeof(ligne),cas_a_traiter);
sscanf(ligne,"%f",&val);
input[i][j]=(fann_type) val;

}


i++;

}
//j'affiche les données recueillies pour controle
for(i=0;i<=5;i++)
{
printf("\nligne n°= %d ", i);
for(j=0;j<=29;j++)
{
printf("%f ", input[i][j]);

}
//printf("tpap=57");
//scanf("%d",&a);
}

//1

fclose(cas_a_traiter);
return 0;
}
A voir également:

7 réponses

dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
7 mars 2009 à 15:20
hello
(de 6 à 7 chiffres aprés la virgule à plus de 4000)
4000 chiffres aprés la virgule ?
0
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009
7 mars 2009 à 15:41
non il y a des données différentes, toutes des nombres réel positifs des tout petits (6 à 7 chiffres derriere la virgule) et des plus gros 3412.01 par exemple (plus de 3000)
0
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009
7 mars 2009 à 16:13
j'ai modifié unn peu le programme:

j'ai supprimé le premier fgets et je force la lecture du fichier avec i

// while(fgets(ligne,12000,cas_a_traiter))
while(i<=380)
{
//printf("tpap=29 entrée dans la lecture");
for(j=0;j<=29;j++)



maintenant le premier caractere de la premiere ligne est bon :D mais c'est le seul :C

heeeeelp
0
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009
7 mars 2009 à 17:10
je probleme doit se trouver là dedeans mais je vois pas où:

if ((cas_a_traiter=fopen("cas_a_traiter.txt", "r"))==0) printf("erreur d'ouverture");
while(fgets(ligne,12000,cas_a_traiter))
{
//printf("tpap=29 entrée dans la lecture");
for(j=0;j<=29;j++)
{

fgets(ligne,sizeof(ligne),cas_a_traiter);
sscanf(ligne,"%f",&val);
input[i][j]=(fann_type) val;

}


i++;

}
0
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
7 mars 2009 à 17:19
je me trompe ou bien tu lis une ligne ou 12000 char puis 29 lignes ou 11401 char ?

while(fgets(ligne,12000,cas_a_traiter))
	{
//printf("tpap=29 entrée dans la lecture");
		for(j=0;j<=29;j++)
		{	
			fgets(ligne,sizeof(ligne),cas_a_traiter);
			sscanf(ligne,"%f",&val);
			input[i][j]=(fann_type) val;
		}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009
7 mars 2009 à 17:42
euh je suis pas sur de comprendre ta phrase désolé



si j'ai bien compris oui dans le premier code

maintenant je lit une ligne de 30 caractere, je la stocke dans le tableau "ligne" qui fait 12000 carac (pour avoir de la marge, je suis passé par un stade où j'essayais d'ouvrir tout le fichier d'un coup) *

puis je lit la ligne avec sscanf qui se charge de retrouver les float dans le fichier (basiquement il supprime les espaces et stocke le reste)




*je viens d'essayer de mettre un tableau que de 30 caracteres, erreur de segmentation directe, et si j'en met 150000 les chiffres enregistrés déconnent encore plus qu'avant donc j'ai un probleme d'allocation quelquepart mais où b*****d*m***** :'(:'(:'(
0
darksamor Messages postés 7 Date d'inscription samedi 7 mars 2009 Statut Membre Dernière intervention 7 mars 2009
7 mars 2009 à 18:23
c'est bon j'ai trouvé


while(fgets(ligne,sizeof(ligne),cas_a_traiter))

{
//printf("tpap=29 entrée dans la lecture");
for(j=0;j<=29;j++)
{

// fgets(ligne,sizeof(ligne),cas_a_traiter);
// sscanf(ligne,"%f",&val);
// input[i][j]=(fann_type) val;
sscanf(ligne,"%f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f ", &input[i][0], &input[i][1], &input[i][2], &input[i][3], &input[i][4], &input[i][5], &input[i][6], &input[i][7], &input[i][8], &input[i][9], &input[i][10], &input[i][11], &input[i][12], &input[i][13], &input[i][14], &input[i][15], &input[i][16], &input[i][17], &input[i][18], &input[i][19], &input[i][20], &input[i][21], &input[i][22], &input[i][23], &input[i][24], &input[i][25], &input[i][26], &input[i][27], &input[i][28], &input[i][29]);



}

en fait c'était le scanf qui était mal formaté
0
dubcek Messages postés 18744 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 4 septembre 2024 5 617
8 mars 2009 à 12:39
essaye avec :
sscanf(ligne,"%{%f}", &input[i][0]);

%{%f} devrait lire autant de float qu'il y en a dans la ligne
0