Lecture ecriture de tres gros fichiers

Résolu
Signaler
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
y a t'il des regles à respecter pour la lecture et l'ecriture de tres gros fichiers texte ?



je parle de fichiers entre 100Mo et 4GO



je suis preneur de tous conseils car les outils traditionnels sont bien bien lent



pour l'instant j'utilise :



ofstream et << >>



David

18 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Une règle c'est d'utiliser un tampon d'une taille assez grande (quelques ko) plutot que caractère par caractère, et d'écrire ce tampon
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Tu n'utilises pas << et >> mais des méthodes permettant de spécifier la taille du buffer à lire ou a écrire (read et write).
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

j'ai mis cela en place dans mon programme :



std::ofstream f_out;

f_out.open ( nomfichier.c_str (), std::ios::out );



char mybuffer [32768];

f_out.rdbuf()->pubsetbuf(mybuffer,32768);



ensuite il suffit de ne pas utiliser std::endl mais seulement "\n"



car std::endl equivaut à "\n" + flush



flush vide le buffer dans le flux et sont utilisation ralentit donc l'opération d'ecriture



il vaut mieux donc eviter std::endl pour les operation d'ecriture massive sur un flux

par contre c'est recommendé pour les fichiers de debugging sinon on ne sait jamais vraiment ou c'est arreté le prog...



Avec tout cela j'ecrit au moins 10x plus vite COOL



je suis à l'ecoute des commentaires car c'est la premiere fois que j'utilise ces fonction :

rdbuf() et pubsetbuf ()



l'utilisation que j'en fait n'est pas forcement academique !!
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Bah non c'est du texte ça !

Mais bon moi j'serais aussi parti sur un ReadFile comme j'arrive à m'en servir maintenant

void Aurevoir( void ); //Bonne journée
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
HANDLE hFile;

char* szData;

DWORD dwFileSize;

DWORD dwByteWritten;



hFile = CreateFile( szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);

if(!hFile)

{

MessageBox(NULL, "Erreur lors de l'ouverture du fichier", szClassName, 0x40);



}



dwFileSize = GetFileSize(hFile, NULL);

szData = new char[dwFileSize+1];



ReadFile(hFile, szData, dwFileSize, &dwByteWritten, 0);
CloseHandle(hFile);
void Aurevoir( void ); //Bonne journée
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Sous Windows:
- ReadFile()
- WriteFile()

ciao...
BruNews, MVP VC++
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

certe l'idée semble être la bonne mais comment implemente t'on une augmentation du buffer sur un ostream ?



je veux dire tres concretement si tu as un petit exemple de code ?



David
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

read et write sont reservé au fichier binaire non ?



mes fichiers sont du texte pur et dur...
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
22 août 2008

Pour l'écriture de buffer, j'ai pas trouvé mieux que le C ...

fwrite(Buffer,TailleD'uneUnitée,TailleTotale,Fichier);

on peux meme sauvegarder des structures avec, c'est sympa si on veux pas passer par les ini (qui sont plus long ...)
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

mais tu fais du binaire ou du texte avec ca ?
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

pourriez vous agrementez vos reponses de tout petit bout de code... ca
permet à mon avis de rendre le forum plus utile à tout le monde !



bon si vous avez pas le temps je comprends... mais un copier coller
rapide d'un bout de prog ou vous utilisez les fonctions citées



@+
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

mais d'ou sortent ces fonctions et type :



HANDLE, CreateFile (), ReadFile (), CloseHandle ()



c'est du C pur, du C++ pur, de la STL du Microsoft ?



il y a un Header à specifier ?



je suis assez attaché à créer du code portable et standard donc j'aimerais savoir ?



a titre indicatif, je suis sous dev cpp 4.9.9.1 avec GCC 3.4.1 - boost 1.31 et wxWidgets 2.6.0
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Bé c'est de l' API, donc exclu Windows ( Voir BruNews il l'a dis au dessus )

Pour utilisaton inclure <windows.h>

Et je suppose que les classe C++ se base la dessus non ? faudrait demandé :)

Et donc pour la portabilité :) bah valable que sous windows donc euh vala quoi :D

void Aurevoir( void ); //Bonne journée
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

bon mais je pense que l'on peut ecrire vite dans un fichier texte en C++ pur je vais encore chercher :



d'ailleurs les fonctions que j'ai presentée plus haut :



std::ofstream f_out;

f_out.open ( nomfichier.c_str (), std::ios::out );



char mybuffer [32768];

f_out.rdbuf()->pubsetbuf(mybuffer,32768);



sont du C++ pur donc portable, en ca marche bien a priori je vais 10x plus vite qu'avant déjà !!



le pb c'est que je ne l'ai maitrise pas tres bien donc bienvenu au
commentaire des expert de ce genre de manip sur les stream en C++
Messages postés
17
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
21 juillet 2005

par rapport au code ci dessus :



std::vector<char> buffer(32768);


out.rdbuf()->pubsetbuf(&buffer[0], buffer.size());



il parait que c'est mieux pour la gestion memoire
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Joky> fais gaffe, CreateFile() retourne INVALID_HANDLE_VALUE (vaut -1) si rate et non 0.

ciao...
BruNews, MVP VC++
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Ahhhhh, windows et toutes ses valeurs, ils vont me faire perdre la tête xD

Remplaçons donc if(hFile == INVALID_HANDLE_VALUE)

Par contre si le test est vérifié ??? est-ce-qu'on doit faire un CloseHandle( ) ???

Parce que c'est quand même ambigu... Soit il à planter et donc détruire quelque chose qui ne vaut rien, bé ça sert à rien :s

Fin voila quoi :)

@ti suite :)
void Aurevoir( void ); //Bonne journée
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
ben non, pas de CloseHandle() puisque tu n'as pas eu de handle valide.

ciao...
BruNews, MVP VC++