Lecture ecriture de tres gros fichiers [Résolu]

ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 14 juil. 2005 à 15:53 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 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
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 14 juil. 2005 à 16:23
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

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de vecchio56
Meilleure réponse
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 14 juil. 2005 à 16:51
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

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de vecchio56
Meilleure réponse
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 14 juil. 2005 à 17:53
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

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de ddesbuis
Meilleure réponse
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 15 juil. 2005 à 08:04
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

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de cs_Joky
Meilleure réponse
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 15 juil. 2005 à 09:18
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

codes-sources a aidé 78 internautes ce mois-ci

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

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 14 juil. 2005 à 16:34
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
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 14 juil. 2005 à 17:25
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
MuPuF 536 Messages postés mercredi 27 avril 2005Date d'inscription 22 août 2008 Dernière intervention - 14 juil. 2005 à 18:40
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
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 15 juil. 2005 à 07:21
0
Merci
mais tu fais du binaire ou du texte avec ca ?
Commenter la réponse de ddesbuis
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 15 juil. 2005 à 08:56
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
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 15 juil. 2005 à 09:46
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
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 15 juil. 2005 à 09:54
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
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 15 juil. 2005 à 10:20
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
ddesbuis 17 Messages postés lundi 16 août 2004Date d'inscription 21 juillet 2005 Dernière intervention - 18 juil. 2005 à 21:29
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 18 juil. 2005 à 21:41
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
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 18 juil. 2005 à 21:47
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 18 juil. 2005 à 22:21
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.