écrire dans un fichier - C++ - Programmation
Marsh Posté le 05-02-2003 à 10:24:23
Pourquoi le fait de déclarer Sortie en variable membre ne fonctionne pas
Marsh Posté le 05-02-2003 à 11:25:03
En fait, dans la classe out, je déclare un objet ofstream comme donnée membre (protected)
std::ofstream Sortie;
autre donnée membre :
char *filename;
Puis, dans le constructeur, j'écris :
Code :
|
Code :
|
NB. impossible d'écrire std::ofstream Sortie( filename, ios::app ); dans la classe -> erreur sur filename
kason
Marsh Posté le 05-02-2003 à 12:21:00
le premier paramètre du constructeur de ofstream est un const char* et toi tu lui fournis un char *... normal !
il faut lire les messages du compilateur
Marsh Posté le 05-02-2003 à 15:07:43
Je me demande si cette méthode est possible (ouvrir le fichier dans un constructeur, écrire via les méthodes de la classe, et fermer le fichier dans le destructeur)
J'ai essayé en créant une donnée membre :
ofstream Sortie;
Marche pas
+ d'infos sur l'implémentation :
Code :
|
Des suggestions, des remarques ou une autre idée d'implémentation ?
kason
Marsh Posté le 05-02-2003 à 22:30:08
déjà, inutile de créer une variable membre filename, ça ne sert à rien vu que tu ne l'utilises que dans le constructeur.
ensuite, regarde la surcharge de l'opérateur << dans la classe ofstream ! il n'utilise pas de string !
enfin, à la place de flush, tu peux utiliser endl qui ajoute une ligne et qui flushe ensuite.
ce qui nous donne le code suivant :
Code :
|
en théorie, ça doit fonctionner. j'attends maintenant la réaction de Taz ou Musaran qui ne vont pas manquer de me dire que mon code est dégueulasse et/ou pas standard
Marsh Posté le 05-02-2003 à 22:35:17
++Taz a écrit : non c'est bon mais quel interet d'avoir un pointeur? |
aucun dans ce cas précis effectivement !
c'est juste une sale habitude que j'ai de déclarer des pointeurs partout
Marsh Posté le 05-02-2003 à 22:46:02
++Taz a écrit : ben alors enleve le |
à vos ordres !
version sans pointeur :
Code :
|
Marsh Posté le 05-02-2003 à 22:50:55
SETI pas bo comme ço?
petite remarque: beaucoup ne réalise pas que endl == '\n' + flush
et le flush est la plus part du temps inutile (surtout pour un fichier avec un buffer de ligne, genre terminal). endl n'est pas un '\n' plus joli à la mode C++, mais bien quelque chose de différent. il n'est pas sale de mettre des '\n' dans ses chaines de caractères
Marsh Posté le 05-02-2003 à 22:56:44
mon code est Taz-compliant !!!!
kason > au passage, en relisant ton source, j'ai pu constater cette magnifique initialisation dans ton constructeur :
Sortie( filename, ios::app); // initialisation
pas étonnant que ça compilait pas...
Marsh Posté le 05-02-2003 à 23:01:57
Harkonnen a écrit : mon code est Taz-compliant !!!! |
comme quoi j'en demande pas trop...
remarque: il faut utiliser les allocateurs C++ et non malloc/free qui se contente de gérer des zone mémoire non-initaliser
new = constructeur+malloc
delete = destructeur+free
deplus ça balance des exceptions, alors que dans le cas de malloc il faut tester le pointeur.
bref, il faut abandonner toutes ses vieilles habitudes de C
et se débarasser des char* au profit des string (je veux plus voir de strdup ou d'autre truc comme ça)
Marsh Posté le 06-02-2003 à 05:48:29
Citation :
|
Ce destructeur est inutile.
Les membres sont automatiquement détruits avec leur 'porteurs'.
Harkonnen a écrit : le premier paramètre du constructeur de ofstream est un const char* et toi tu lui fournis un char *... normal ! |
Ça gène rien (c'est l'inverse qui n'est pas possible).
Code :
|
Quand un pointeur/référence se dit "sur const", ça veut dire qu'il s'engage à ne pas modifier son référent, pas que celui-ci ne peut pas changer par d'autres intermédiaires.
Conclusion: C++ n'a pas de spécification de constance pure pour une variable.
Marsh Posté le 06-02-2003 à 06:37:42
Musaran a écrit :
Ce destructeur est inutile. |
tout en effet
Marsh Posté le 06-02-2003 à 08:53:14
Musaran a écrit : |
Encore une habitude que j'ai de toujours fermer/détruire ce que j'ouvre/construit.
Musaran a écrit : |
Oui, disons que j'étais en train de bosser quand j'ai lu son 1er post, et j'ai un peu lu ce 1er post en biais...
Marsh Posté le 06-02-2003 à 13:11:35
En suivant les tuyaux que vous m'avez donné, cela marche
Merci à tous.
kason
Marsh Posté le 06-02-2003 à 13:48:49
kason a écrit : En suivant les tuyaux que vous m'avez donné, cela marche |
euh, c'est plus que des tuyaux qu'on t'a filé
Marsh Posté le 07-02-2003 à 13:33:34
oui, c'est vrai
kason
Marsh Posté le 05-02-2003 à 10:18:23
Je souhaite écrire dans un fichier en mode append (nom du fichier : filename)
ofstream Sortie( filename, ios::app );
Contexte :
j'ai une classe out
je souhaite :
- ouvrir le fichier dans le constructeur.
- faire des écritures dans les fonctions membres (sans avoir à ouvrir le fichier et le refermer, car déjà ouvert)
- fermer le fichier dans le destructeur
Est-ce possible ?
J'ai bien essayé de créer un objet ofstream Sortie comme donnée membre mais cela ne marche pas...
Tout ça, c'est pour éviter d'ouvrir et de fermer le fichier à chaque fois qu'on y écrit qq chose.
Question : comment dois-je m'y prendre ?
kason
---------------
Seul le calme paisible d'un lac peut endiguer la force furieuse d'un torrent.