begin process at 2012 05 30 03:57:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

ça marchait ce matin mais plus maintenant!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

ça marchait ce matin mais plus maintenant!

mardi 18 juillet 2006 à 17:06:20 | ça marchait ce matin mais plus maintenant!

marieinthesky

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.

mardi 18 juillet 2006 à 17:33:20 | Re : ça marchait ce matin mais plus maintenant!

dletozeun

Salut,

Tout d'abord avant de lire le code, on peut dire qu'il y a un manque d'efficacité dans la methode...puisque ca fait bcp bcp d'ouverture et de fermeture de fichiers et c'est pas l'operation la plus rapide...
Je sais pas combien tu as de fichiers a ouvrir masi moins le prog e nouvre mieux il se porte, donc je te conseillerais (si ca te dis) de refaire le programme en chargeant dans des tableaux l'ensemble des valeurs de chaque fichier d'un seul coup. Et là tu ouvre seulement le nombre de fichiers presents....
A toi de voir.

Bon je vasi essayer de regarder le code.
mardi 18 juillet 2006 à 17:54:46 | Re : ça marchait ce matin mais plus maintenant!

dletozeun

Oups j'ai pas fais gaffe, tu donne bien le nb de fichiers donc au pire tu as 998*300=299 400 ouvertures et fermetures alors qu'avec la methode efficace seulment 998!

Bon sinon j'aierais bien savoir où tu initialise la variable: maxsize qui sert de borne dasn une boucle for...Si tu l'initialise nul part ca peut venir de la.

Et ne le prends pas mal mais je trouve que tes boucles for son super mal présentées...et meme le reste d'ailleurs ( au niveau de l'indentation) (a moins que ca vienne de cppfrance)
Sinon je vois pas d'erreurs enormes dans le reste...
Mais si c'est un probleme au niveau de la gestion des fichiers, a mon avis la 2nde methode sera bcp plus simple et plus sure a ce niveau la, puisque qu'ensuite tu n'as plus qu'a manipuler des tableaux.
mercredi 19 juillet 2006 à 09:46:44 | Re : ça marchait ce matin mais plus maintenant!

marieinthesky

merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $?@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
mercredi 19 juillet 2006 à 09:46:59 | Re : ça marchait ce matin mais plus maintenant!

marieinthesky

merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $?@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
mercredi 19 juillet 2006 à 09:47:25 | Re : ça marchait ce matin mais plus maintenant!

marieinthesky

merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $?@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
mercredi 19 juillet 2006 à 09:47:57 | Re : ça marchait ce matin mais plus maintenant!

marieinthesky

merci pour le conseil, je vais essayer d'utiliser un tableau.
Pour maxsize, c'est une constante qui est déclarée dans le fichier .h que j'utilise pour mon projet (car à priori, ça devrait toujours être 10 mais si un jour je dois modifier mon modèle, je saurais où changer maxsize).
Je te tiendrai au courant quand j'aurais réussi à programmer cette $?@*# de fonction, qui était sensée être faite en deux coups de cuillère à pot mais sur laquelle j'ai passé presque deux jours.
mercredi 19 juillet 2006 à 17:27:25 | Re : ça marchait ce matin mais plus maintenant!

dletozeun

Ya pas de quoi! :)
Bon courage pour la réecriture, tu verras ca va sans doute etre plus simple.
Décidement je sais pas ce qui se passe avec tes posts mais tout est en triple mmeme quadruple a chaque fois!
mercredi 19 juillet 2006 à 17:27:49 | Re : ça marchait ce matin mais plus maintenant!

dletozeun

Ya pas de quoi! :)
Bon courage pour la réecriture, tu verras ca va sans doute etre plus simple.
Décidement je sais pas ce qui se passe avec tes posts mais tout est en triple mmeme quadruple a chaque fois!
mercredi 19 juillet 2006 à 17:28:17 | Re : ça marchait ce matin mais plus maintenant!

dletozeun

A tiens moi aussi! :)

1 2

Cette discussion est classée dans : fichier, int, line, tempfile, lev


Répondre à ce message

Sujets en rapport avec ce message

vc++ : pb d'ecriture dans fichier taille sup a prévu [ par adidmamah ] g un groooooo pb qui m'épate sincerementj'ecris dans un fichier en utilisant un structure : struct data { char nom[30]; [C] lecture d'un fichier [ par GazGaz ] lu allalors voila en fait je lis un fichier en c et le probleme c'est que ce fichier est composé de lignes dont la taille exècede largement les 80 car enregister les resultats dans un fichier txt. [ par ekinoks ] j'essepaire que vous allé pouvoir m'evité le susside:-/c'est un decrypeteur de fichier, j'aimeré enregistré tout les resultat dans un fichier TXT com Ecriture dans un fichier [ par sebleboss2002 ] Salut tout le monde !Ce coup-ci, j'ai un problème dans l'enregistrement de type integer dans un fichier texte. Voici mon code :#include <iostream.h&g Lecture Fichier texte --> Variable [ par Guidelor ] BonjourJ'ai un fichier texte dans lequel il y a 2 lignes:12345678J'aimerais que mon prog lise le 1er chiffre et le mette dans la variable int Chiffre1 c++ creation d'un fichier texte a nom variable [ par sloaneaaaa ] ben voila je voudrai creer un fichier texte auquel je puisse donner n'importe quel nom ms g des erreurs que je comprend pasle nom de fichier est ds un aidez moi c pour lire ds un fichier question bateau... [ par roomsmush ] pkoi ce code ne marche pas j'ai beau me casser la tete sur mon ecran rien y fait : sachant que c:\fcach est rampli par la chaîne suivante : "c:\fichie steganographie C [ par trypon ] Bonjour je programme sous ggcc (LINUX) et j'ai un petit pb avec mon programme j'arrive a mettre un texte dans l'image mais pas à faire le contrairela Nombre d'entier d'un fichier composé de chiffres [ par ValToutCourt ] Bonjour à tous, j'ai un probléme en programmation, je dois recupérer le nombre d'entier stoké dans un fichier, ca parait bidon, mais j'ai deja tout es


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales