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

C++ Discussion :

Probleme compilation de fstream avec gcc


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Probleme compilation de fstream avec gcc
    Bonjour à tous,

    J'ai un problème qui est bien embêtant et je n'ai trouvé aucune solution sur le web.
    J'ai des programmes en c++ qui marchent très bien sur Windows avec Visual Studio. Mais pour plusieurs raisons je doit les faire marcher sur Linux. J'installe donc Codeblocks, choisi le compilateur gcc copie-colle mon main.cpp et là c'est le drame ça compile pas : la librairie <fstream> ne reconnaît plus les string, ni les flux de type <<. Voici mon code (raccourci) :
    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
     
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    int main(int n, char *argument[])
    {
    	string fasta = argument[1];
    	string output = argument[2];
     
            ifstream fichier(fasta, ios::in);//Erreur ici
    	ifstream fout(output, ios::out | ios::trunc);//Erreur ici
     
            if(fichier && fout)
            {
                 fout <<"Blablabla"<< endl;  //Erreur ici
                 fichier.close();
                 fout.close();
            }
            return 0;
    }
    Pour l'ouverture des fichiers, l'ajout de .c_str() résout le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichier(fasta.c_str(), ios::in); //Marche
    Je suppose qu'il existe une solution du même genre pour fout << "Blablabla" mais mise à part ma simple curiosité (les bibliothèques de gcc seraient moins performantes? Non mises a jours?), j'ai pas mal de programmes avec pas mal de commandes comme ça donc si je n'avait pas à toutes les reprendre, ça m'arrangerai...

    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Points : 120
    Points
    120
    Par défaut
    salut

    normalement le constructeur de ifstream prend un const char* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    explicit ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );
    d'après : http://www.cplusplus.com/reference/i...ream/ifstream/

    donc la solution string.c_str() a plus de chance de marcher avec plusieurs compilateurs,

    sinon cela n'a rien à voir avec la performance, les compilateurs implémentent les librairies standard à leurs façons et sur certains point il y a des différences

    Cdt

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse. Je suppose qu'il y a donc aucun moyen de passer outre les différences de bibliothèque... J'ai plus qu'a modifier tous mes programmes.
    Bonne continuation!

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    En fait ce qui se passe c'est que ton code qui marche avec Visual Studio 2010 utilise un constructeur de std::ifstream et std::ofstream prenant une std::string en argument. Ce constructeur n'est disponible que pour le nouveau standard du C++, le C++0X, dont la sortie est très prochaine et dont la plupart des compilateurs ont commencé l'implémentation.

    En C++03 (le standard actuel) il n'existe qu'un seul constructeur, prenant un const char*. D'ailleurs ton code ne compile pas avec VS2005 ou VS2008.

    Donc tu as deux options :
    - Soit tu continues de passer la std::string directement et il faut alors que tu actives l'option C++0X pour gcc dans codeblocks "settings/compiler and debuggers/Have g++ follow the coming C++0x ISO language standard"

    -Soit tu appelles .c_str() pour renvoyer le char* sous-jacent à la std::string et donc utiliser le constructeur C++03 de ifstream/ofstream

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup! Ta solution est efficace pour ma première erreur; c'est déjà ça!
    En revanche il plante toujours sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fout << "Blablabla" << endl;

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Ok c'est bon j'ai trouvé la solution : il fallait ouvrir le fichier en écriture avec ofstream et non ifstream :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ifstream fichier(fasta, ios::in);
    ofstream fout(output, ios::out | ios::trunc);
    fout << "blablabla" << endl; //Marche!!
    Merci à tous!

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

Discussions similaires

  1. [SDL 1.2] Compiler project SDL avec gcc sur Mac OSX Mavericks
    Par Rorshak dans le forum SDL
    Réponses: 1
    Dernier message: 10/02/2015, 14h53
  2. Compilation avec GLUT
    Par emykev22 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 01/09/2014, 19h53
  3. Comment compiler non-ANSI avec gcc ?
    Par dva2tlse dans le forum Linux
    Réponses: 6
    Dernier message: 21/01/2012, 13h53
  4. Compilation des MFC avec gcc
    Par ricardo8125 dans le forum MFC
    Réponses: 10
    Dernier message: 22/12/2006, 18h29
  5. Problème de compilation avec gcc
    Par Niktou dans le forum Linux
    Réponses: 9
    Dernier message: 27/09/2005, 16h18

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