Lecture ecriture de tres gros fichiers [Résolu]

Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 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
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
3
Merci
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

Merci vecchio56 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de vecchio56
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
3
Merci
Tu n'utilises pas << et >> mais des méthodes permettant de spécifier la taille du buffer à lire ou a écrire (read et write).

Merci vecchio56 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de vecchio56
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
3
Merci
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 !!

Merci ddesbuis 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de ddesbuis
Messages postés
1791
Date d'inscription
lundi 22 novembre 2004
Dernière intervention
31 janvier 2009
3
Merci
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

Merci cs_Joky 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de cs_Joky
Messages postés
1791
Date d'inscription
lundi 22 novembre 2004
Dernière intervention
31 janvier 2009
3
Merci
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

Merci cs_Joky 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 105 internautes ce mois-ci

Commenter la réponse de cs_Joky
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Sous Windows:
- ReadFile()
- WriteFile()

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
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
Commenter la réponse de ddesbuis
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
read et write sont reservé au fichier binaire non ?



mes fichiers sont du texte pur et dur...
Commenter la réponse de ddesbuis
Messages postés
536
Date d'inscription
mercredi 27 avril 2005
Dernière intervention
22 août 2008
0
Merci
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 ...)
Commenter la réponse de MuPuF
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
mais tu fais du binaire ou du texte avec ca ?
Commenter la réponse de ddesbuis
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
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



@+
Commenter la réponse de ddesbuis
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
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
Commenter la réponse de ddesbuis
Messages postés
1791
Date d'inscription
lundi 22 novembre 2004
Dernière intervention
31 janvier 2009
0
Merci
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
Commenter la réponse de cs_Joky
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
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++
Commenter la réponse de ddesbuis
Messages postés
17
Date d'inscription
lundi 16 août 2004
Dernière intervention
21 juillet 2005
0
Merci
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
Commenter la réponse de ddesbuis
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Joky> fais gaffe, CreateFile() retourne INVALID_HANDLE_VALUE (vaut -1) si rate et non 0.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1791
Date d'inscription
lundi 22 novembre 2004
Dernière intervention
31 janvier 2009
0
Merci
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
Commenter la réponse de cs_Joky
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
ben non, pas de CloseHandle() puisque tu n'as pas eu de handle valide.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.