Bonjour,
Comment lire un fichier texte le plus rapidement possible à l'aide de la STL? Les accès disque ralentissent mon progamme, si je chargeais le fichier directement dans un buffer, je pourrais accélérer le traitement non?
Cordialement,
Rodrigue
Version imprimable
Bonjour,
Comment lire un fichier texte le plus rapidement possible à l'aide de la STL? Les accès disque ralentissent mon progamme, si je chargeais le fichier directement dans un buffer, je pourrais accélérer le traitement non?
Cordialement,
Rodrigue
http://c.developpez.com/faq/cpp/?pag...RS_full_buffer
A la différence près c'est que cela n'utilise pas la STL... Est-ce impératif dans ton cas?
A+
Merci beaucoup!
La STL ne permet pas de lire un fichier ;) La SL oui
Désolé de n'avoir pas répondu plus tôt (ma connexion internet est cassée à la maison ...).
Je suppose que SL signifie Standard Library ? De quoi s'agit-il des librairies que j'utilise par défaut ? J'aimerais savoir/comprendre ce que j'utilise (pour être moins bête :lol:).
Merci!
Oui, tu supposes bien. Cela regroupe les bibliothèques fournies en standard avec un compilo C++. La STL n'est qu'une partie, un sous-ensemble bien réduit de la bibliothèque standard.
Je ne voudrais pas abuser de ton temps mais pourrais-tu me citer d'autres librairies appartenant à la SL ?
La lecture de mon fichier par un buffer n'a pas accéléré la lecture de mon fichier. Je pense qu'il s'agit plus d'optimiser mes fonctions de lecture:
Et voici ma fonction FindToken:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42while(std::getline(buffer, line)) { if(! line.empty()) { std::istringstream iss(line); std::string sub; switch(FindToken(line)) { case COMMENT: break; case VERTEX: float x, y, z; std::getline(iss, sub, ' '); std::getline(iss, sub, ' '); (std::istringstream)sub >> x; std::getline(iss, sub, ' '); (std::istringstream)sub >> y; std::getline(iss, sub, ' '); (std::istringstream)sub >> z; this->points.push_back(gPoint3D(x,y,z)); break; case VERTEX_NORMAL: break; case VERTEX_TEXTURE: break; case FACE: int A, B, C; std::getline(iss, sub, ' '); std::getline(iss, sub, ' '); (std::istringstream)sub >> A; A--; std::getline(iss, sub, ' '); (std::istringstream)sub >> B; B--; std::getline(iss, sub, ' '); (std::istringstream)sub >> C; C--; this->triangles.push_back(gTriangle3D( this->points[A], this->points[b], this->points[C])); break; case UNKNOWN: std::cerr << "[LINE " << nLine << "] Unknown: " << line << std::endl; break; } } nLine++; }
Je pense que je fais beaucoup de traitement pour rien!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25enum Element {VERTEX, VERTEX_TEXTURE, VERTEX_NORMAL, FACE, COMMENT, UNKNOWN}; inline Element gObject3D::FindToken(std::string& token) { std::string::size_type loc; loc = token.find_first_of("v ", 0); if(loc != std::string::npos && loc == 0) return (VERTEX); loc = token.find_first_of("vt ", 0); if(loc != std::string::npos && loc == 0) return (VERTEX_TEXTURE); loc = token.find_first_of("vn ", 0); if(loc != std::string::npos && loc == 0) return (VERTEX_NORMAL); loc = token.find_first_of("f ", 0); if(loc != std::string::npos && loc == 0) return (FACE); loc = token.find_first_of("#", 0); if(loc != std::string::npos && loc == 0) return (COMMENT); return (UNKNOWN); }
En fait pour l'instant, je dois détecter deux types d'objets des VERTEX ou des FACE.
Voici un exemple de VERTEX:
et pour les FACE:Code:
1
2 v 1.23434 2.34443 3.15009 v %f %f %f
Notez que je pourrais également avoir des faces avec ce format là:Code:
1
2 f 56 23 11 f %d %d %d
PS: il s'agit de lire des objets 3D (.obj)Code:
1
2 f 123/356 432/109 567/443
Merci!
Cordialement,
Rodrigue
Dans la SL, il y a les flux d'entrées/sorties, ceux que tu utilises ici ;)
Si tu veux savoir ce qui ralentit effectivement ta fonction, une seule chose à faire, profiler ton code.
Si tu es sous Linux, regarde du côté de cachegrind, sur Windows, il y a chez AMD un bon logiciel pour les proc AMD, gratuit, et chez Intel il y a VTune, payant mais avec une démo.
Ok merci!