Ecrire de gros fichier texte en C++ pur - C++ - Programmation
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
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 !
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.
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
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.
Marsh Posté le 15-07-2005 à 17:02:13
OK mec comme tu veux mais je te trouve pas constructif
tans pis pour toi :-)
Marsh Posté le 15-07-2005 à 17:05:07
les autres ont vu dans cette dernière réponse une certaine ironie.
Marsh Posté le 15-07-2005 à 17:22:39
ReplyMarsh Posté le 15-07-2005 à 17:25:45
ddesbuis a écrit : > Évite aussi de mélanger char et char[2] : '\n' et pas "\n" |
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 )
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 ;-)
Marsh Posté le 15-07-2005 à 18:00:17
'\n' = 1 char
"\n" = '\n','\0' = 2 char
non non je t'assure , c'est pas Taz qui se ridiculise
Marsh Posté le 15-07-2005 à 18:01:33
ddesbuis a écrit : |
Avant d'utilsier Boost & wxWidgets, tu devrais reviser ta STL ainsi que le concept d'exemple
Marsh Posté le 15-07-2005 à 18:35:44
ddesbuis a écrit : scuse moi gars mais je te trouve tres impoli... |
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à !
Marsh Posté le 15-07-2005 à 19:02:30
n'empéche que les moindres carrés ca me casse les testicules
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 :-)
Marsh Posté le 15-07-2005 à 19:15:06
bordel tu connais pas std::vector<T>
vector<char> buffer(N) ca construit, genre, un vecteur (un tabelot ) de char de N éléments, style :
http://www.sgi.com/tech/stl/Vector.html
and STFU
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 !
Marsh Posté le 15-07-2005 à 19:27:56
tu fais du C++ voila pourquoi
et perso se tapper 32768 octets sur la pile c pas malin malin
Mais bon je ne t'apprends rien. Je veut dire tu fais des moindres carrés
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
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 ...
Marsh Posté le 15-07-2005 à 21:24:40
ReplyMarsh 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)
Marsh Posté le 15-07-2005 à 22:52:38
ReplyMarsh 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 ...
Marsh Posté le 16-07-2005 à 00:20:12
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