Ecrire de gros fichier texte en C++ pur

Ecrire de gros fichier texte en C++ pur - C++ - Programmation

Marsh Posté le 15-07-2005 à 13:12:58    

Comment ecrire efficacement (donc rapidement) des fichiers de 100Mo à 4-5Go en texte avec un ofstream ?
 
il me semble que :
 
    std::ofstream f_out;      
    f_out.open ( nomfic.c_str (), std::ios::out );
     
    char mybuffer [32768];
    f_out.rdbuf()->pubsetbuf(mybuffer,32768);
 
permet d'accelerer le process à condition d'utiliser des
 
"\n" et non des std::endl ( std::endl = "\n" + flush() )
 
si un expert en la matiere savait me donner une recette !! I would be very happy
 
 

Reply

Marsh Posté le 15-07-2005 à 13:12:58   

Reply

Marsh Posté le 15-07-2005 à 14:04:16    

ta méthode fonctionne. j'espère que t'as pas blindé ton code de std::endl dans tous les sens ...
 
Évite aussi de mélanger char et char[2] : '\n' et pas "\n"
 
Après en écriture, en standard, y a pas de mystère. Fais confiance à l'OS sous jacent : y a pas de méthode mirable, il faut juste espérer que ton OS sait faire du caching de disque efficacement, et ça passera tout seul.
 
 
Enfin, fait gaffe de pas trop tapper sur la pile quand même :
 
    char mybuffer [32768];
    f_out.rdbuf()->pubsetbuf(mybuffer,32768);  
 
Moi j'écrirais :
 
std::vector<char> buffer(N);
out.rdbuf()->pubsetbuf(&buffer[0], buffer.size());  
 
 
Tu peux également définir ta propore classe de streambuf

Reply

Marsh Posté le 15-07-2005 à 14:39:55    

> Évite aussi de mélanger char et char[2] : '\n' et pas "\n"
 
explique moi ca ??? quel est la diff entre '\n' et "\n"
 
 
> Moi j'écrirais :
> std::vector<char> buffer(N);
> out.rdbuf()->pubsetbuf(&buffer[0], buffer.size());  
 
buffer(N); ??? qui c'est N ... je pige pas cette écriture !!!
 
merci de m'eclairer !

Reply

Marsh Posté le 15-07-2005 à 15:19:21    

OK, range les buf et tout ça : ça fait 2 jours que tu fais du C++, c'est pas la peine de te prendre le choux, surtout que tu vas dans le mur. utilise les fstream tout bêtement, quelque soit la taille du fichier et ça ira très bien.

Reply

Marsh Posté le 15-07-2005 à 16:50:28    

scuse moi gars mais je te trouve tres impoli...
 
demander quand on ne sait pas c'est la base pour apprendre ...  
et les forums sont des lieux pour s'entraider pas pour frimer
 
si tu veux te la jouer frime je te conseille de discuter C++ avec Bjorn Stroustrup .. je serai trop content de te voir froncer les sourcils...
 
pour ma part j'ai ecrit un prog de photogrammétrie orthophoto et calcul par les moindres carrés.. le prog utilise Boost et wxWidgets... je ne suis donc pas un naze man... mais si j'ai encore des tas de choses a apprendre ma force etant peut de le savoir contrairement a toi qui parade ... borgne au milieu des aveugles...
 
a bon entendeur salut

Reply

Marsh Posté le 15-07-2005 à 16:57:30    

je parade pas, ton message précédent est affligeant, avec ton dernier message, t'en feras rire plus d'un. C'est pas la peine de nous faire une démo, tu t'es ridiculisé, c'est tout.

Reply

Marsh Posté le 15-07-2005 à 17:02:13    

OK mec comme tu veux mais je te trouve pas constructif
 
tans pis pour toi :-)

Reply

Marsh Posté le 15-07-2005 à 17:05:07    

les autres ont vu dans cette dernière réponse une certaine ironie.

Reply

Marsh Posté le 15-07-2005 à 17:22:39    

Bjarne Stroustrup pas Bjorn  :o  


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 15-07-2005 à 17:25:45    

ddesbuis a écrit :

> Évite aussi de mélanger char et char[2] : '\n' et pas "\n"
 
explique moi ca ??? quel est la diff entre '\n' et "\n"
 
merci de m'eclairer !


Je dirais (exprience en C) :
 - '\n' : simple quote signifie que tu as un caractère. Donc ca sera un retour a la ligne (La touche Entree en somme !).
 - "\n" : chaine de caracteres. Donc ca affichera \n. Enfin la j'en suis moins sur ...
 
 
(Siouplait, me tapez pas si j'ai dit une cauneurie ;) )


Message édité par sn_pilot le 15-07-2005 à 17:26:53
Reply

Marsh Posté le 15-07-2005 à 17:25:45   

Reply

Marsh Posté le 15-07-2005 à 17:34:51    

non pour ecrire \n dans le flux en tant que chaine de caractere il faut ecrire
 
cout << "ce que tu veux \\n";
 
on double de \ pour qu'il soit consideré comme un caractere et ca donne :  
ce que tu veux \n
 
et sorry pour monsieur bjarne dont j'ai raté le nom ;-)

Reply

Marsh Posté le 15-07-2005 à 18:00:17    

'\n' = 1 char
"\n" = '\n','\0' = 2 char :o
 
non non je t'assure , c'est pas Taz qui se ridiculise :o

Reply

Marsh Posté le 15-07-2005 à 18:01:33    

ddesbuis a écrit :


buffer(N); ??? qui c'est N ... je pige pas cette écriture !!!


 
Avant d'utilsier Boost & wxWidgets, tu devrais reviser ta STL [:pingouino] ainsi que le concept d'exemple [:pingouino]

Reply

Marsh Posté le 15-07-2005 à 18:35:44    

ddesbuis a écrit :

scuse moi gars mais je te trouve tres impoli...
 
demander quand on ne sait pas c'est la base pour apprendre ...  
et les forums sont des lieux pour s'entraider pas pour frimer
 
si tu veux te la jouer frime je te conseille de discuter C++ avec Bjorn Stroustrup .. je serai trop content de te voir froncer les sourcils...

pour ma part j'ai ecrit un prog de photogrammétrie orthophoto et calcul par les moindres carrés.. le prog utilise Boost et wxWidgets... je ne suis donc pas un naze man...
mais si j'ai encore des tas de choses a apprendre ma force etant peut de le savoir contrairement a toi qui parade ... borgne au milieu des aveugles...
 
a bon entendeur salut



---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 15-07-2005 à 18:48:36    

Arrete Jag c'est un gars qui fait des moindres carrés o.O tu risque gros là !

Reply

Marsh Posté le 15-07-2005 à 19:02:30    

n'empéche que les moindres carrés ca me casse les testicules


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 15-07-2005 à 19:04:56    

bon donc  
'\n' et le caractere saut de ligne
 
alors que
"\n" est une chaine de caractere contenant le caractere saut de ligne
 
voila donc l'histoire
 
reste ma question sur buffer(N) ?
 
à vous de voir si vous voulez repondre ou juste deconner :-)

Reply

Marsh Posté le 15-07-2005 à 19:15:06    

bordel tu connais pas std::vector<T> :o
 
vector<char> buffer(N) ca construit, genre, un vecteur (un tabelot :o) de char de N éléments, style  :
 
http://www.sgi.com/tech/stl/Vector.html
 
and STFU :o


Message édité par Joel F le 15-07-2005 à 19:15:21
Reply

Marsh Posté le 15-07-2005 à 19:21:22    

bon donc il faut ecrire :
 
std::size_type N = 32768;
std::vector<char> buffer(N);
out.rdbuf()->pubsetbuf(&buffer[0], buffer.size());  
 
et en quoi cela est il mieux que :
 
 char mybuffer [32768];
 f_out.rdbuf()->pubsetbuf(mybuffer,32768);  
 
c'est une question pas de l'ironie !

Reply

Marsh Posté le 15-07-2005 à 19:27:56    

tu fais du C++ voila pourquoi :o
et perso se tapper 32768 octets sur la pile c pas malin malin [:pingouino]
Mais bon je ne t'apprends rien. Je veut dire tu fais des moindres carrés

Reply

Marsh Posté le 15-07-2005 à 19:54:01    

au contraire tu m'apprends des trucs Captain, et c'est pour ca que je pose des questions...
 
la pile certe mais std::vector va bien chercher aussi son allocation memoire quelque part non ? tu veux dire que std::vector sait mieux gerer les rescources memoire ? c'est ce qui ce dit en tout cas ... mais concretement pourquoi c'est mieux ?
 
bon la je chipote ... car ds mes prog j'utilise quasi jamais de char[] mais tjs des std::vector<char>
 
 
je disais ce que je programmais plus pour discuter qu'autre chose ... j'ai surement pas la pretention d'être l'as des as du C++ mais bon on fait des trucs sympa qui sont bien utilse dans notre metier :-)
 
et sur ce bon WE à vous

Reply

Marsh Posté le 15-07-2005 à 20:17:53    

Ce que veux dire Joel, enfin je pense peut-être mal ..;)
C'est qu'il vaut mieux déclarer ça dans la classe mais pas dans une fonction car cela sera mis dans la pile, et là ça peut être chaud si c'est gros ...

Reply

Marsh Posté le 15-07-2005 à 21:24:40    

blastman a écrit :

Bjarne Stroustrup pas Bjorn  :o


Bjork, pas Bjorn :o

Reply

Marsh Posté le 15-07-2005 à 21:36:36    

laisse tomber JoelF, il est pas récupérable.

Reply

Marsh Posté le 15-07-2005 à 22:22:11    

mais si tout le monde est récupérable!
 
ddesbuis > cherche la difference entre pile et tas (stack & heap)

Reply

Marsh Posté le 15-07-2005 à 22:52:38    

Taz a écrit :

laisse tomber JoelF, il est pas récupérable.


 
tu es mezant  :cry:

Reply

Marsh Posté le 15-07-2005 à 22:59:33    

bah non, je suis juste stupéfait, j'ai jamais vu quelqu'un retourner sa veste aussi vite ... le mec il fait encore le coup pour std::vecto<> : d'abord il connaît pas, ensuite il dit qu'il utilise que ça. Idem pour les allocations dynamiques ...

Reply

Marsh Posté le 16-07-2005 à 00:20:12    

[:cupra]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed