Lecture ecriture de tres gros fichiers

Résolu
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005 - 14 juil. 2005 à 15:53
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 18 juil. 2005 à 22:21
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
14 juil. 2005 à 16:23
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
14 juil. 2005 à 16:51
Tu n'utilises pas << et >> mais des méthodes permettant de spécifier la taille du buffer à lire ou a écrire (read et write).
3
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
14 juil. 2005 à 17:53
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 !!
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
15 juil. 2005 à 08:04
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
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
15 juil. 2005 à 09:18
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
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
14 juil. 2005 à 16:09
Sous Windows:
- ReadFile()
- WriteFile()

ciao...
BruNews, MVP VC++
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
14 juil. 2005 à 16:34
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
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
14 juil. 2005 à 17:25
read et write sont reservé au fichier binaire non ?



mes fichiers sont du texte pur et dur...
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
14 juil. 2005 à 18:40
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 ...)
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
15 juil. 2005 à 07:21
mais tu fais du binaire ou du texte avec ca ?
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
15 juil. 2005 à 08:56
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



@+
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
15 juil. 2005 à 09:46
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
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
15 juil. 2005 à 09:54
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
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
15 juil. 2005 à 10:20
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++
0
ddesbuis Messages postés 17 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 21 juillet 2005
18 juil. 2005 à 21:29
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
18 juil. 2005 à 21:41
Joky> fais gaffe, CreateFile() retourne INVALID_HANDLE_VALUE (vaut -1) si rate et non 0.

ciao...
BruNews, MVP VC++
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juil. 2005 à 21:47
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
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
18 juil. 2005 à 22:21
ben non, pas de CloseHandle() puisque tu n'as pas eu de handle valide.

ciao...
BruNews, MVP VC++
0