Si tu veux un algo très général et qui marche aussi bien pour les fichiers de 500 Ko sans un seul retour chariot, ou les fichiers de même taille avec 50 000 lignes, je te propose la structure suivante.
Dans l'idée, il vaut mieux ne lire le fichier qu'une seule fois. Les entrées/sorties sont ce qu'il y a de plus long à exécuter (même si souvent l'OS masque ça par un joli petit cache disque).
Ensuite, on ne sait pas combien d'octets on va lire, donc il faut, pour chaque ligne, une structure qui grossisse en fonction des besoins. Enfin, on ne sait pas combien de lignes on va lire : même raisonnement, il faut une structure à grosseur dynamique.
La structure la plus dynamique qui existe, et la plus économe en consommation mémoire, c'est la liste chaînée. Donc, dans l'idée, tu peux définir une liste chaînée où chaque noeud est une ligne, et, pour chaque ligne, une autre liste chaînée pour son contenu.
Maintenant, on ne va pas définir un noeud de liste chaînée par caractère, la consommation mémoire exploserait aussi !
Alors je te propose que chaque noeud soit une sorte de buffer : on aurait des morceaux de ligne (de, par exemple, 4000 caractères), et des paquets de lignes (par exemple, 100 lignes).
Maintenant, l'implémentation (C++). Je suppose que tu as une classe template ChainedList qui implémente proprement les listes chainées.
Tu pourrais alors écrire :
Code :
- const int TAILLE_MORCEAU = 4096;
- const int TAILLE_PAQUET = 100;
- class MorceauLigne {
- char buffer[TAILLE_MORCEAU];
- long taille; // Taille réellement utilisée
- ...
- }
- class Ligne {
- ChainedList<MorceauLigne> ligne;
- long longueur;
- ...
- }
- class PaquetLigne {
- Ligne paquet[TAILLE_PAQUET];
- long taille; // Nombre de lignes réellement utilisées
- // dans ce paquet
- ...
- }
- class Texte {
- ChainedList<PaquetLigne> texte;
- long numLignes;
- ...
- }
|
Voilà, c'est pour l'idée. Maintenant, côté implémentation C++ pure et dure, il y a clairement des petites améliorations à apporter pour l'efficacité (par exemple, l'utilisation de pointeurs sur Ligne plutôt que des objets dans le tableau défini dans PaquetLigne).
Message édité par BifaceMcLeOD le 12-11-2002 à 18:17:52