Bonjour à tous,
j'essaye d'écrire une fonction qui va faire la moyenne de plusieurs données lues dans des fichiers, ça marchait ce matin puis j'ai voulu faire "plus joli" et enlever des trucs inutiles, et maintenant ça ne marche plus et je n'arrive pas à savoir pourquoi! Si ça ce trouve, c'est juste une erreur débile que n'importe qui pourra détecter, alors si ça dit à quelqu'un de relever le challenge et de trouver pourquoi ça ne marche pas, je lui serais éternellement reconnaissante!
les fichiers contenant les données sont nommés temp001.txt à temp999.txt (on peut en avoir moins que 999 : on en a nbrep) et contiennent
- une ligne d'entête
- plusieurs lignes contenant: t N1 I1 N2 I2 N3 I3...jusqu'à N10 I10 maximum
pour t allant de 1 à 300
et ce que je voudrais c'est, pour chaque t, calculer la moyenne des N1 entre tous les fichiers, la moyenne des I1 entre tous les fichiers....
donc mon idée c'était
d'ouvrir le premier fichier, de lire la première ligne, de mettre les valeurs dans un tableau de moyennes, de fermer le fichier,
d'ouvrir le second fichier, de lire la première ligne et de calculer la moyenne avec les valeurs déjà dans le tableau de moyennes,
faire pareil pour le troisième fichier...
puis de passer à la deuxième ligne pour tous les fichiers...jusqu'à la dernière ligne (un tableau permet de garder , pour chaque fichier, la position où on en est).
voilà la fonction :
int computemeans (int records, int nbrep, TABCHAR* outfile )
{ int n ; //numéro du fichier
int c, d , u ; //chiffres des centaines, dizaines, unités du numéro de fichier
int line ; // numero de la ligne
int lev ; //numero des N et I
int N, I, t ; //données
float formermean ; //variable intermédiaire : ancienne moyenne avant prise en compte de la donnée lue
float meantot[10] ;
float meandis [10] ; // tableaux contenant les moyennes de N et I
char header[255] ;
char buffer[1000] ; //tampons de lecture (une ligne)
char** next ; //emplacement du prochain chiffre dans le tampon de lecture
TABCHAR tempfile ;
streamsize nbchar, sumchar ; //nombre de caractères lus dans le fichier ce coup-ci et en tout
streamsize* positions = new streamsize[nbrep+1] ;
//array that will keep track of the positions in each file
//(by summing the counts of characters read because tellg has a bug)
ifstream entree ;
ofstream sortie ;
cout << "computing means of "<< nbrep<< " repetitions on "<<records <<" lines"<<endl ;
/*----------------------------initialize--------------------------*/
sortie.open (*outfile, ios::app) ;
tempfile[0] = 't' ;
tempfile[1] = 'e' ;
tempfile[2] = 'm' ;
tempfile[3] = 'p' ;
tempfile[7] = '.' ;
tempfile[8] = 't' ;
tempfile[9] = 'x' ;
tempfile[10] = 't' ;
tempfile[11] = '\0' ;
for (n=1; n<=nbrep; n++) positions[n]=0 ;
/*---------------starts reading the first record in each file
then the second record in each file etc...----------*/
for (line=0; line<=records;line++) /*for each record (i.e. time)*/
{ for (lev=0; lev<maxsize ; lev++) {meantot[lev] = 0 ; meandis[lev] = 0 ;}
for (n=1; n<=nbrep; n++) /* for each file (i.e. repetition)*/
{ c = int(n/100) ; /*hundreds digit*/
d = int((n-100*c)/10) ; /*tens digit*/
u = (n - 100*c - 10*d) ; /*units digit*/
tempfile[4] = chiffres + c ;
tempfile[5] = chiffres + d ;
tempfile[6] = chiffres + u ;
entree.open (tempfile, ios::in) ;
entree.clear();
entree.seekg(positions[n], ios::beg) ;
if (line == 1978)
{ entree.get(header, 255) ;
nbchar = entree.gcount() ;
sumchar = nbchar + positions[n] ;
positions[n] = sumchar +1;
}
else
{ lev = 0 ;
entree.get(buffer, 1000) ;
nbchar = entree.gcount() ;
sumchar = nbchar + positions[n] ;
positions[n] = sumchar +1 ;
t= int(strtod(buffer, next)) ;
N = int(strtod(*next, next)) ;
while (N>0) /* while the end of the line is not reached*/
{ I = int(strtod(*next,next)) ;
lev += 1 ;
formermean = meantot[lev] ;
meantot[lev] = (formermean * (n-1) + N) / n ;
formermean = meandis[lev] ;
meandis[lev] = (formermean * (n-1) + I) / n ;
//cout <<" N"<<lev<<"="<<N<<" I" <<lev<<"=" <<I ;
N = int(strtod(*next, next)) ;
} // end of the line is reached
} // end if not header
entree.close() ;
} // end "n" files
if (line==0)
{ sortie<<header ;
} else
{ sortie << "\n" << t << "\t" ;
for (lev=1; lev<maxsize ; lev++)
{ sortie << meantot[lev] << "\t" << meandis[lev] << "\t" ;
}
} // end if line != 0
} // end "line" records
sortie.close() ;
delete positions ;
return (0) ;
}
et un exemple de fichier :
t N1 I1 N2 I2 N3 I3 N4 I4 N5 I5 N6 I6 N7 I7 N8 I8 N9 I9 N10 I10
0 10 0 100 0 1000 0
1 10 1 100 3 1000 30
2 10 1 100 4 1000 60
merci 10000 fois d'avance!
Marie
P.S. : je sais que ce serait plus pratique d'utiliser tellg pour avoir la position du curseur de lecture dans le fichier, mais après avoir passé une journée à tester tellg dans tous les sens, j'en ai déduit qu'il avait un bug donc j'utilise gcount à la place.