acces multiple donnees fichier txt

acces multiple donnees fichier txt - C++ - Programmation

Marsh Posté le 07-12-2004 à 23:50:13    

Salut à tous,  
J'ai un petit souci:
Je dois acceder des centaine de fois à un fichier pour y recuperer des informations.
Je ne vous cache pas que c très lent.
Je voudrais essayer de copier mon fichier dans un buffer pour accelerer mes acces. Or, je ne sais pas vraiment comment faire pour creer ce buffer, comment ensuite acceder à mes données dans ce buffer !
Si vous pouvez m'aider
Merci
Damien

Reply

Marsh Posté le 07-12-2004 à 23:50:13   

Reply

Marsh Posté le 08-12-2004 à 09:19:52    

pourquoi ne pas tout mettre en mémoire ? ya quoi exactement dans ce fichier ?

Reply

Marsh Posté le 08-12-2004 à 10:27:46    

C'est un fichier netlist qui contient du texte.
Mais si je le mets en memoire, comment je fais pour l'utiliser ensuite.
Le fichier fait environ 2000 lignes.
je te donne le code que j'ai utiliser pour le mettre en memoire:
 
int main()
{
ifstream is ("C:\\Prog\\COB-10.edn" );
is.seekg (0, ios::end);
int length( is.tellg() );
is.seekg (0, ios::beg);
char * buffer = new char [length];
is.read (buffer,length);
string str( buffer);
delete[] buffer;
cout << str;  
 
merci de votre aide

Reply

Marsh Posté le 08-12-2004 à 13:03:56    

Citation :

Mais si je le mets en memoire, comment je fais pour l'utiliser ensuite.

 
Ben si tu nous expliquais l'utilisation que tu veux en faire, on pourrait te faire des suggestions.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2004 à 13:25:24    

OK excuse
Donc voilà, je fais un programme qui rempli un arbre avec des informations d'un schéma electronique (ex n° patte, nom patte, type, ...)
Ces informations je les trouve dans un fichier netlist (texte) qui fais comme je l'ai dejà dis, environ 2000 lignes (il y a beaucoup d'info).
Je dois acceder à ces infos très souvent, puisque pour chaque composant, il faut que je cherche ces diff infos (je ne sais pas si je suis très clair).
 
Donc j'ai besoin accéder à ce string comme si c'était un fichier:
Lire un ligne et la traiter
Chercher un element ou plusieurs dans le texte
Extraire des informations.
 
J'ai dejà réaliser mon truc, mais sans mettre le fichier en memoire, et donc c assez long (env 2 min).
 
Merci de votre aide

Reply

Marsh Posté le 08-12-2004 à 14:20:57    

Citation :

Je dois acceder à ces infos très souvent, puisque pour chaque composant, il faut que je cherche ces diff infos


C'est a dire que pour chaque info necessaire, tu reparse a chaque fois les 2000 lignes? ca expliquerait pourquoi ca prend du temps.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2004 à 14:29:36    

je repasse pas vraiement ttes les lignes, mais je parcours depuis le debut jusqu'à trouver l'info voulu.
Auris - tu une autre solution pour aller plus vite ?
merci a +

Reply

Marsh Posté le 08-12-2004 à 15:07:47    

moi je mettrait tou en mémoire, structures, tableau ... et après je chercherai dedans même si ya bcp d'info !

Reply

Marsh Posté le 08-12-2004 à 15:09:09    

ouais mais comment tu cherche dedans une fois en memoire ?

Reply

Marsh Posté le 08-12-2004 à 15:41:33    

bon fait voir a quoi ressemble les première ligne de ton fichier texte et dit moi ce que tu cherche dedans a chaque fois et je pourrait t'expliquer comment

Reply

Marsh Posté le 08-12-2004 à 15:41:33   

Reply

Marsh Posté le 08-12-2004 à 15:48:34    

voilà le genre de ligne:
(net TCK
      (joined
       (portRef DA11 (instanceRef J3))
       (portRef A2_A (instanceRef U12))
       (portRef &2 (instanceRef R49))
       (portRef &9 (instanceRef J4))
       (portRef &1 (instanceRef R43))
       (portRef A2_B (instanceRef U12))))
     (net TDI
      (joined
       (portRef DA9 (instanceRef J3))
       (portRef A0_B (instanceRef U12))
       (portRef &2 (instanceRef R47))
       (portRef &5 (instanceRef J4))
       (portRef A0_A (instanceRef U12))))
     (net N16829008
      (joined
       (portRef DA1 (instanceRef J3))
       (portRef &2 (instanceRef JP17))))
     (net N16829030
      (joined
       (portRef DA0 (instanceRef J3))
       (portRef &2 (instanceRef JP18))))
     (net N19380745
      (joined
       (portRef &1Y (instanceRef U33))
       (portRef OBAREBAR_A (instanceRef U12))))
     (net N19379856 (par ex)
      (joined
       (portRef &1A (instanceRef U33))
       (portRef &2 (instanceRef R101))
       (portRef OBAREBAR_B (instanceRef U12))
       (portRef A2 (instanceRef SW7))))
 
A chaque fois je recherche la chaine devant net et j'utilise les information devans portref et instanceRef.
En resume:
Recherche ds le txt la chaine de carac placé devant 'net', et ensuite je dois remplir les champs d'une classe avec les autres infos.
 
Merci a+

Reply

Marsh Posté le 08-12-2004 à 15:57:24    

bah si tu utilises toutes les lignes au final, tu as intérêt à parser tout ton fichier en un coup au début du programme.

Reply

Marsh Posté le 08-12-2004 à 16:09:25    

oui mais comment faire ,
Et comment recuperer mes informations ?

Reply

Marsh Posté le 08-12-2004 à 16:19:54    

moi je ferai un truc dans ce genre la, mais c'est peut etre complétement naze et pas adapté a ton problème ...
 

Code :
  1. typedef struct
  2. {
  3.    char m_szName[32];
  4.    int m_iNumPortRef;
  5.    int *m_pInstanceRef;
  6. } pouet;
  7. std::vector<*pouet> tab;
  8. int g_iSize=0;
  9. int Chargement(char *szFileName)
  10. {
  11. FILE *f = fopen(szFileName, "r" );
  12. if(!f)
  13.  return 0;
  14. char szName[23];
  15. char szPortRef;
  16. pouet p;
  17. while(!fscanf(szFileName, "(net %s\n(joined\n%s\n", szName, szPortRef);
  18. {
  19.  printf(p.m_szName, szName);
  20.  p.m_pInstanceRef = ParsePortRef(szPortRef, &p.m_iNumPortRef);
  21.  ++g_iSize;
  22.  tab.push(&p);
  23. }
  24. fclose(f);
  25. return 1;
  26. }
  27. int *ParsePortRef(char *string, int *num);
  28. {
  29. ...
  30. *num = ...;
  31. int *truc = new[*num];
  32. ...
  33. return truc;
  34. }
  35. int comparer(char *string)
  36. {
  37. for(int i=0; i<g_iSize; i++)
  38. {
  39.  if(!strcmp(tab[i]->m_szName, string))
  40.  {
  41.   ...
  42.   return 1;
  43.  }
  44. }
  45. return 0;
  46. }

Reply

Marsh Posté le 08-12-2004 à 17:05:04    

Citation :

Donc voilà, je fais un programme qui rempli un arbre avec des informations d'un schéma electronique


Il a quelle tete ton arbre?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-12-2004 à 18:23:09    

Mon arbre, il a une tete de c...
Non je rigole, en fait ma racine a un fils qui a autant de frère qu'il y a de pattes à mon composant.
En faite, c'est une sorte de liste chaine.
 

Reply

Marsh Posté le 09-12-2004 à 10:52:00    

Un peu de code pour la structure de donnée de ton arbre et grossierement l'algo de comment tu le remplis, please...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed