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

SL & STL C++ Discussion :

Probleme sur ifstream/ofstream acces violation lors de l'appel de ma fonction


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut Probleme sur ifstream/ofstream acces violation lors de l'appel de ma fonction
    Bonjour,

    Mon code:
    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
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    void macopy(ifstream entree, ofstream sortie)
    {
        //std::string ligne;
     
        //while ( std::getline( entree, ligne ) )
        {
            //sortie << ligne << std::endl;
        }
    }
     
    int main()
    {
    	cout << "Debut" << endl;
     
            ifstream fichier("ttt.txt");
    	ofstream fichier2("ttt_copy.txt");
     
    	macopy(fichier, fichier2);
     
    	//fichier.close();
    	//fichier2.close();
     
     
    	cout << "Fin" << endl;
     
    	return 1; //<-- j'ai un acces violation ici, dans la pile, je me trouve dans les fonctions string
    }
    Donc bon le code est assez simple, je pense qu'il parle de lui-meme.
    Je souhaite faire une copie de fichier(dans un premier temps...) et j'ai un acces violation a la fin de mon programme, j'ai essayer de tout commenter mais ca plante pareil.

    Par contre si je ne fait pas l'appel a ma fonction ca ne plante pas?!!
    Et comme vous voyez je fais rien dedans.

    Syst: WindowsXP, VC++ 6.0

    Merci

    PS: dans mon fichier ttt.txt y a que du texte normal et bidon.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    les flux de la SL ne se copient pas. Or, en passant ces flux en paramètres de ta fonction, le compilateur va faire une copie de ces flux.

    Pour éviter cette copie cachée, il faut passer ces flux par référence constante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void macopy(const ifstream & entree, const ofstream & sortie)
    C'est un classique: en passant un paramètre par référence constante, on ne fait pas de copie de l'objet passé en paramètre. Ceci a d'importantes conséquences, autant sur le "design" que d'un point de vue "technique":
    -> ça va plus vite (pas de copie)
    -> on est sûr que l'objet passé en paramètre ne sera pas modifié (mot clé const)

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void macopy(ifstream entree, ofstream sortie)
    Ca compile? Ca ne devrait pas, il n'y a pas de constructeur de copie pour les IOStreams standards. C'est peut-etre la la cause.

    Je vois que tu utilises VC++6 (qu'est-ce que tout le monde a a utiliser des vieilleries comme ca?). Il a peut-etre une version anterieure des IOStreams, qui effectivement avait un constructeur de copie -- mais je ne sais plus avec quel semantique.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Thanks all, ca marche
    Ok, c'est note pour la reference.

    Citation Envoyé par Jean-Marc.Bourguet
    Je vois que tu utilises VC++6 (qu'est-ce que tout le monde a a utiliser des vieilleries comme ca?)
    Oui ca compile sans erreur ni warning. Ben c'est celui qu'on utilise au taf et que j'ai chez moi. Question d'habitude aussi je suppose et il faut le temps de passer de l'un a l'autre.
    Perso j'aurai prefere passer au Studio 2005 mais trop gourmand en ressource pour mon pc de chez moi. voila

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 295
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par kacedda Voir le message
    Oui ca compile sans erreur ni warning.
    Une preuve de plus de la dangerosité de VC6 (implémentation de la SL/STL trop différente du standard)

    Citation Envoyé par kacedda Voir le message
    Ben c'est celui qu'on utilise au taf
    Pfff... ça me hérisse les poils d'entendre ça. Aucun argument n'est valable:
    -> coût: il existe plusieurs IDE gratuits et bien meilleurs que VC6
    -> temps pour la migration: à moins d'avoir un projet énorme, ça se fait en temps raisonnable, voire quasi nul (pour une migration de VC6 à VC8 notamment). Et dans le cas d'un projet énorme, il faudra de toutes façon migrer un jour ou l'autre, au plus vite c'est fait, au moins les pertes sont lourdes.
    -> légèreté de VC6 par rapport aux autres IDE. Déjà, je ne suis pas certain que VC8 soit réellement plus gourmand que le 6, surtout la version express. Mais surtout, il n'y a pas que Visual dans la vie...

    Franchement, aujourd'hui, lorsqu'on me demande de bosser sur un projet sous VC6, je refuse cathégoriquement, à moins de me donner le temps d'effectuer la migration (temps qui, généralement, est compris dans le temps de "configuration de mon environnement").

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    ok d'accord avec le fait qu'il respecte (moyennement)pas le standard.

    Mais pour le reste:
    Une seule question: Pourquoi les gens utilisent Visual C++ 6.0?
    Je ne dis pas que c'est la meilleure/seule reponse mais: parce que MFC, donc utiliser d'autre IDE gratuits ou autre...

    Pourquoi les entreprises n'evoluent pas:
    - parce qu'il faut racheter le nouveau Visual a moins d'avoir l'abonnement, l'ergonomie a changer=>les gens ne s'y retrouvent pas toujours, etc...
    - parce que sur les gros projets, ca prend plus de temps que ce qu'on pourrait penser:dll moyennement compatible entre VC6 et VS2005... le mieux est de tout faire passer d'un coup, mais ca a un cout...
    - parce qu'en France, c'est la politique du "ca marche! pourquoi changer?"...
    - ...

    Enfin je suis pas chef, et je ne connais pas toutes les raisons!

    Sinon: perso ca m'arrive d'utiliser les MFC, et VS2005 ne passe pas chez moi, il rame trop et prend bcp de place disque(intellisense). donc oui je pourrai passer a Qt ou autre. Je pourrai aussi m'acheter un autre pc...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    PS: sinon je suis tout a fait d'accord avec toi, j'ai teste et je prefere 2005, et a la limite quand je peux j'essaie de compiler sous gcc. Mais bon les gens n'aiment pas changer quand ca marche et moi pour mon besoin, maintenant que je l'ai installé(VC6++) je n'envisage/n'ai pas vraiment besoin de changer.

    Mais mauvais point pour moi: il me compile des trucs qu'il devrait pas

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/11/2009, 08h58
  2. Réponses: 3
    Dernier message: 13/12/2006, 16h01
  3. Créer un tableau lors de l'appel d'une fonction
    Par MiJack dans le forum Langage
    Réponses: 11
    Dernier message: 01/02/2006, 11h18
  4. Réponses: 2
    Dernier message: 09/01/2006, 09h38
  5. Réponses: 5
    Dernier message: 06/01/2006, 11h41

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