C++ operator << pour les ofstream

C++ operator << pour les ofstream - C++ - Programmation

Marsh Posté le 28-06-2005 à 11:45:35    

Voilà, j'ai un problème réccurent et assez curieux (j'utilise visual c++ .net, mais je rois que sous g++ [donc sous linux] j'ai rencontrer le même problème) :
 

Code :
  1. ofstream& operator << (ofstream& str,const MeshnDPm& mesh)
  2. {
  3. str << mesh.nb_vertex << " " ;
  4. return str ;
  5. }


 
çà marche, çà compile
 
mais  
 

Code :
  1. ofstream& operator << (ofstream& str,const MeshnDPm& mesh)
  2. {
  3. str << " " << mesh.nb_vertex ;
  4. return str ;
  5. }


 
çà compile pas :  
"error C2666: 'operator`<<'' : 7 overloads have similar conversions"
 
Je peux remplacer le " " par n'importe quel chaine de caractère çà me fait toujours la même chose. La chose la plus pénible c'est que sur certain projet çà marche (les deux formes) et sur certains non.
 
Si quelqu'un a déjà rencontrer ce problème (et surtout à compris d'où çà venait) merci :D
 
 
EDIt : j'ai rajouter le return str mais je l'avais enlever ici pour que le code soit le plus petit possible :p


Message édité par LordHarryPotter le 28-06-2005 à 12:14:36
Reply

Marsh Posté le 28-06-2005 à 11:45:35   

Reply

Marsh Posté le 28-06-2005 à 12:03:46    

bah bha bhbhahahshashd
 
on fais du polymorphisme :o
 
alors ton opérateur, ça signature, c'est
 
ostream& operator<<(ostream&, const T& );
 
et n'oublie pas le return !
 
 
tu m'étonnes que ça soit récurrent : c'est n'importe quoi juqu'à maintenant.

Reply

Marsh Posté le 28-06-2005 à 12:15:06    

Non le plus chelou c'est que pour un ostream çà marche mais pas pour les ofstream& et oui j'ai pas oublier le return.
 
Sinon qu'est ce qu'est du n'importe quoi ?

Reply

Marsh Posté le 28-06-2005 à 12:24:17    

PARCE QU'ON NE SURCHARGE CET OPÉRATEUR QUE POUR LA BASE OSTREAM OU ISTREAM SELON.

Reply

Marsh Posté le 28-06-2005 à 12:25:52    

:cry: et pourquoi on peut pas surcharger l'opérateur << pour les ofstream  :cry:

Reply

Marsh Posté le 28-06-2005 à 12:40:13    

je pense a ca!
corrige moi taz si pas bon
 

Citation :

La classe ofstream : cette classe est dédiée aux écritures réalisées dans des fichiers. La classe ofstream est dérivée de la classe ostream et bénéficie donc de toutes les méthodes définies dans cette classe. Voici un exemple d'utilisation :
 
#include <iostream>
#include <fstream>
 
int main()
{
  // Deux modes d'ouverture sont possibles :
  //   - ios:: out -> création, fichier écrasé si existant
  //   - ios:: app -> ajout en fin de fichier
 
  ofstream fichierSortie("donnees.txt", ios:: out);
 
  // Test d'ouverture du fichier
 
  if (!fichierSortie) {
    cerr << "Problème d'ouverture de fichier" << endl;
    exit(1);
  }
 
  fichierSortie << "J'écris des caractères dans le fichier "
                << "et des nombres : " << 10 << " " << 20  
                << endl;
 
  // Fermeture du fichier
 
  fichierSortie.close();
}
 


Message édité par shikra le 28-06-2005 à 12:41:24

---------------
L'abus de programmation est dangereux pour la sante!!
Reply

Marsh Posté le 28-06-2005 à 12:47:35    

:heink: rapport avec le sujet ?
 
le problème qu'il a, c'est simplement qu'après une redirection non surchargée, il se retrouve avec un ostream, et non pas un ofstream, c'est là la source de tous ses déboires
 
Edit :  
qui plus est, c'est de mauvais goût, ce genre de choses

Citation :

ofstream fichierSortie("donnees.txt", ios:: out);

Et je ne parlerai pas du exit(1) ni même du fichiersortie.close()


Message édité par theshockwave le 28-06-2005 à 13:01:15
Reply

Marsh Posté le 28-06-2005 à 13:47:40    

Okay, et dans ces cas là comment qu'on fai pour écrire dans un fichier : medite pas qu'il faut que je passe forcément par un fprintf ninia  :cry:  
 
Si je comprend bien la classe ofstream si çà marche tant mieux et si çà marche pas ben tant pis  :heink:

Reply

Marsh Posté le 28-06-2005 à 13:49:59    

une simple surcharge comme celle-ci ne te convient pas ?
 

Code :
  1. ostream& operator << (ostream& str,const MeshnDPm& mesh)
  2. {
  3. str << " " << mesh.nb_vertex ;
  4. return str ;
  5. }


 
Edit : note que je ne connais pas le type de nb_vertex, mais je suppose qu'il s'agit d'un type primitif pour lequel la surcharge de << est déjà faite, non ?
Edit 2 : c'est ce que Taz t'avait dit depuis le début :

Citation :

alors ton opérateur, ça signature, c'est
 
ostream& operator<<(ostream&, const T& );


Message édité par theshockwave le 28-06-2005 à 13:51:38
Reply

Marsh Posté le 28-06-2005 à 14:00:12    

Je crois qu'il n'a pas compris que ofstream hérite de ostream. Donc ce qui marche pour ostream marche pour ofstream.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 28-06-2005 à 14:00:12   

Reply

Marsh Posté le 28-06-2005 à 14:02:01    

Je dis peut-être une méga c**** mais tant pis:
Problème de const avec mesh.nb_vertex?
 
"error C2666: 'operator`<<'' : 7 overloads have similar conversions"
Et si tu cast mesh.nb_vertex?
 
Edit: oui bon puisque c'est un int, ni l'un, ni l'autre...


Message édité par slash33 le 28-06-2005 à 14:06:15
Reply

Marsh Posté le 28-06-2005 à 14:03:39    

...

Reply

Marsh Posté le 28-06-2005 à 14:04:06    

theshockwave a écrit :

une simple surcharge comme celle-ci ne te convient pas ?
 

Code :
  1. ostream& operator << (ostream& str,const MeshnDPm& mesh)
  2. {
  3. str << " " << mesh.nb_vertex ;
  4. return str ;
  5. }


 
Edit : note que je ne connais pas le type de nb_vertex, mais je suppose qu'il s'agit d'un type primitif pour lequel la surcharge de << est déjà faite, non ?
Edit 2 : c'est ce que Taz t'avait dit depuis le début :

Citation :

alors ton opérateur, ça signature, c'est
 
ostream& operator<<(ostream&, const T& );



 
nb_... est un

Code :
  1. int

donc parfaitement primitif ;)
 
Je vais essayer mais je voulais faire deux méthodes distinctes (pour l'ostream typiquement utilisé via

Code :
  1. cout

écrire des information lisible alors qu'avec l'ofstrem je ne note que le strict minimum (pas de chaine de caractère autre que les blancs).
 
Mais sinon oui çà marche en ne mettant pas d'opérateur

Code :
  1. ofstream& operator << ...

Reply

Marsh Posté le 28-06-2005 à 14:12:17    

ostream est typiquement utilisé avec les ostream .|
ce que tu es fais, c'est naz, ça ne rime à rien. Si tu as besoin de deux formes de sérialization, et bien fais autrement. Mais pas comme ça. Un flux, c'est un flux, où qu'il soit. Faire des daubes uniquements pour les fstreams, c'est écrire des lignes pour rien.
 
Comment faire ? une fonction membre par type de sérialization, ou une classe Serilaizer qui t'aide  flux << My::serialize(obj) ... etc. Ou aussi les modificateur de flux.
 
 
Bref ton truc, ça ne marche pas.

Reply

Marsh Posté le 28-06-2005 à 14:45:10    

Désolé Taz :(
 
En faite mon prof de tp de c++ nous avait appris à faire comme çà, donc c'est dur de perdre des vieilles habitudes.
 
J'ai retenu la leçon maintenant ;)

Reply

Marsh Posté le 28-06-2005 à 14:45:55    

j'avais déjà fait un topic pour faire un petit manipulateur de flux, c'est vachement sympatoche.

Reply

Marsh Posté le 28-06-2005 à 15:02:16    

J'espère que tu réalises bien la crêtinerie de ton prof quand même. Dans un vrai programme, a fortiori graphique, cout tu ne le verras jamais !

Reply

Marsh Posté le 28-06-2005 à 15:11:26    

Ouais :o

Reply

Sujets relatifs:

Leave a Replay

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