IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

[Langage] soucis fstream en parametre de fonction


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut [Langage] soucis fstream en parametre de fonction
    Bonjour,

    j'ai un soucis de compilation, je poste un bout de code qui montre mon problème puis je commente:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    string* maPremiereClasse::GenereEnteteFichier( string * path)
    {
    string* ret;
    maClass *toto;
    fstream outputFile = open( (*path).c_str(), std::out|std::app);
     
    ...
     
    //premier passage en parametre, ca marche pour le premier "etage"
    ret = toto->CalculData( toto,(fsream *) & outputFile); //cast mis pour que ca compile
    }
     
    string* maClass::CalculData( maClass* dataCourante, fstream &outputFile)
    {
     
     autreClass titi;
    string * ret;
     
    //repassage du meme fichier en parametre, ca foire...
    ret = titi->CalculOperation (titi, (fstream *)outputFile);
     
    }
     
    string* maClass::CalculOperation( maClass* dataCourante, fstream &outputFile)
    {
    ...
    }
    Le soucis concerne juste la gestion des flux, on a une fonction de base qui ouvre le fichier et je veux pouvoir placer ce flux en paramètre pour que d'autres fonctions puissent ecrire dans ce meme fichier deja ouvert.

    Initialement, je placais les type "fstream" directement en parametre mais j'ai lu sur le forum qu'il faut les placer par référence.
    ==>pour le premier etage ca marche mais un cast est nécéssaire...

    Enfin bref, si quelqu'un voit mon erreur je suis tout ouie!

    merci d'avance

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string* maClass::CalculData( maClass* dataCourante, fstream &outputFile)
    {
        [...]
        ret = titi->CalculOperation (titi, (fstream *)outputFile);
        [...]
    }
    Tu ne peux pas caster ton outputFile, en pointeur de fstream. Vue le prototype de ta focntion CalculOperation tu n'as pas besoin de cast.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    Ben ouai, c'est ce que je me dis aussi
    je n'avais pas mis de cast au debut mais si je mets rien, ca compile pas!

  4. #4
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Je crois qu'il faudrai que tu boss un peu sur l'utilisation des pointeurs : garde à l'esprit d'utiliser les pointeur le moins possible (pour moi juste pour l'héritage).
    Voila un code fonctionnelle (MS VS 8)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #include <string>
    #include <fstream>
    using namespace std;
     
    class maPremiereClasse
    {
    public:
    	void GenereEnteteFichier( string * path);
    };
     
    class maClass
    {
    public:
    	void CalculData( maClass* dataCourante, fstream &outputFile);
    	void CalculOperation( maClass* dataCourante, fstream &outputFile);
    };
     
    void maPremiereClasse::GenereEnteteFichier( string * path)
    {
     
    	maClass *toto = new maClass();
    	fstream outputFile;
     
     
    	//premier passage en parametre, ca marche pour le premier "etage"
    	toto->CalculData( toto, outputFile); //cast mis pour que ca compile
    }
     
    void maClass::CalculData( maClass* dataCourante, fstream &outputFile)
    {
     
    	maClass titi;
     
    	//repassage du meme fichier en parametre, ca foire...
    	titi.CalculOperation (&titi, outputFile);
     
    }
     
    void maClass::CalculOperation( maClass* dataCourante, fstream &outputFile)
    {
     
    }
     
    int main() {}
    Dit nous ce que te dis ton compilateur, et qu'elle compilateur utilise tu.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par défaut
    Les *fstreams ne sont pas copiables, me semble-t-il (constructeur de copie privé) tu dois donc les passer en référence.

    Edit : J'ai rien dit.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    [Niark13] Oui j'ai lu ca aussi qu'il faut passer en reférence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void maPremiereClasse::GenereEnteteFichier( string * path)
    {
     
    	maClass *toto = new maClass();
    	fstream outputFile;
     
     
    	//premier passage en parametre, ca marche pour le premier "etage"
    	toto->CalculData( toto, outputFile); //cast mis pour que ca compile
    }
    ca ne marche pas ca.

    [themadmax] Pour bosser les pointeurs c'est bon je connais:
    j'ai commencé le 1er octobre mon boulot, je reprends un gros projet ou je suis la 5eme personne a passer
    ==> l'architecture est un peu bordélique et je peux pas tout changer l'utilisation des pointeurs
    genre tout simple==> dans des classes, il n'y a pas de constructeur par defaut!!!
    donc si tu veux utiliser un objet temporaire t'es obligé de tout déclaré en pointeur d'objet...
    et c'est la meme chose dans pas mal d'endroit

    tu vois le resultat
    --->A--->B-->C....

    Enfin le probleme n'est pas la

    je lache l'affaire==> je ferme le fichier avant d'entrer dans la fonction, je file le chemin en parametre et le reouvre dedans, c'est lourd mais ca contourne le probleme et si un jour j'ai le temps je reviendrais dessus

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut



    J'ai trouvé!
    l'erreur à la con==>
    le traditionnel copier/coller a encore fait des siennes:

    dans la définition de la deuxième méthode, j'ai oublié de mettre le "maClass::"

    Alalalala!

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par loicounet Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ret = titi->CalculOperation (titi, (fstream *)outputFile);
    Ca, c'est une erreur, par exemple. C'est un cast C (non qui ne devrait plus être utilisé) qui va faire n'importe quoi. Utilise les *_cast<>() à la place (ou simplement &outputfile pour récupérer un pointeur sur ce fstream).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 97
    Par défaut
    je me permet de faire remonter ce sujet, j'ai le même problème pour passer un flux comme paramètre de fonction.

    fonction1: j'ouvre un fichier et récupere un flux
    fonction2: je travaille sur un flux passé en parametre
    fonction3: idem fonction2

    j'appelle la fonction1 et récupère un flux en sortant de la fonction
    puis j'appelle la fonction2 qui elle meme appelle la fonction3

    je me mélange totalement au niveaux des déclaration "&" "*"ifstream / l'appel des fonction..etc.

    mes déclarations sont-elles correctes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fonction1(ifstream *FileStream,char *cPathFile);	//ouverture de fichier
    int fonction2(ifstream &FileStream);		//parcourt et lecture du contenu du fichier
    int fonction3(ifstream &FileStream, char *cOutputBuffer,int iLineNumber);//lit une ligne particuliere
    je m'en sort pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parametre de fonction
    Par yoshï dans le forum Linux
    Réponses: 1
    Dernier message: 09/01/2006, 10h46
  2. parametre et fonction
    Par jeff_! dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 09h55
  3. Réponses: 13
    Dernier message: 13/10/2005, 16h03
  4. Réponses: 4
    Dernier message: 26/01/2005, 13h08
  5. [langage] procedure : recuperation de parametres
    Par K-ZimiR dans le forum Langage
    Réponses: 7
    Dernier message: 22/04/2004, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo