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 :

Choisir fichier utilisé par un iftream


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut Choisir fichier utilisé par un iftream
    Bonjour,

    J'essaye de récupérer toutes les lignes d'un fichier ( entree.txt dans ce cas ) qui sera indiqué par l'utilisateur et les imprimer à l'écran.

    Problème : le constructeur de ifstream veut une string contenant le nom d'un fichier et refuse nomDuFichier ( variable contenant le nom )

    Je sais pas si j'ai été très clair et compréhensible

    Voila le 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
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
     
    int main(){
        string ligne;
        string copieDesLignes;
        string nomFichier = " \"entree.txt\" ";
        ifstream fichierEntre(nomFichier);
        // Ca marche en mettant "entree.txt" à la place de nomFichier pourtant.
     
        while(getline(fichierEntre,ligne)){
            copieDesLignes += ligne;
            copieDesLignes += "\n";
        }
        cout << copieDesLignes;
    }

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Pourquoi est-ce que tu mets des guillemets et des espaces dans la chaîne qui doit contenir le nom du fichier ?
    Le programme cherche un fichier qui s'appelle (sans les barres verticales, mais avec les espaces) | "entree.txt" |.
    Il ne risque pas de le trouver !
    Ceci fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string nomFichier = "entree.txt";
    Ensuite, le constructeur de « std::ifstream » (comme toutes les autres fonctions d'ouverture de fichier) prend comme paramètre un « const char * », et non pas un « std::string ».
    C'est pour cette raison que ça fonctionne quand tu utilises directement le nom du fichier (sans passer par une variable).
    Comment convertir une string en char* ?

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Arf, le problème c'est que les fstreams ne prennent pas de std::string en argument mais seulement des chaînes à la C, à l'ancienne. Faut donc lui donner sa soupe correctement à papy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichierEntre(nomFichier.c_str());

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Comme tu l'as dit : Arf
    Je m'attendais à une erreur plus complexe en fait, j'avais vu dans le debugger qu'il me baratinait quelque chose avec des const char* mais j'ai pas tilté

    Merci à vous deux, voici le code final pour ceux que ça intéresse ( c'est notamment le 1er exercice du 7e chapitre de Penser en C++ )

    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
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
     
    // #1
     
     
    class texte{
        public:
        string copie;
        texte(string nomFichier = "main.cpp");
        void afficheContenu();
    };
     
    texte::texte(string nomFichier){
        string ligne;
        ifstream fichierEntre(nomFichier.c_str());
        while(getline(fichierEntre,ligne)){
            copie += ligne;
            copie += "\n";
        }
    }
     
    void texte::afficheContenu(){
        cout << "Voici ce que le fichier contient :" <<  copie <<  endl;
    }
     
    int main(){
        string nomFicherCustom;
        cin >> nomFicherCustom;
     
        texte fichierEntree(nomFicherCustom);
        texte sansFichierInitial;
     
        fichierEntree.afficheContenu();
        sansFichierInitial.afficheContenu();
     
    }

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Content de voir que tu t'en es sorti.
    Juste deux remarques…

    La première concernant ton constructeur.
    Enfin, plus exactement son paramètre.
    En le déclarant comme tu le fais, tu provoques une copie d'objet qui pourrait être évitée.
    Plus d'informations ici.

    La seconde concerne le début du programme.
    J'ai tendance à ne pas trop faire confiance à l'opérateur de redirection depuis un flux d'entrée, du moins pour lire les chaînes de caractères (à tort ?).
    De mémoire, il s'arrête à la lecture du premier caractère « espace blanc » (espace, tabulation, retour à la ligne…).
    Ça peut tout à fait être l'effet recherché (par exemple en combinaison avec la fonction « std::ws » qui lit tous les « espaces blancs » d'un flux d'entrée), j'en suis conscient.
    Mais pour le cas général, la lecture de ceci ne devrait pas faire de mal.

    D'autant plus que l'on peut spécifier à la fonction « std::getline » un autre délimiteur que '\n'.

    [Edit]
    Je viens de (re)voir que tu utilises déjà « std::getline » pour lire le contenu du fichier…
    Bon, il faut juste savoir que l'on peut aussi l'utiliser pour lire depuis l'entrée standard.
    [/Edit]

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

Discussions similaires

  1. fenetre" fichier utilisé par..
    Par gyll dans le forum Word
    Réponses: 5
    Dernier message: 02/04/2008, 15h25
  2. copier un fichier utilisé par une processus xp
    Par jvnet dans le forum Windows XP
    Réponses: 2
    Dernier message: 26/08/2007, 23h20
  3. [JNI] Fichier utilisé par un autre processus
    Par Julaie95 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 10/08/2006, 11h39
  4. [C#][VS2003] Détecter 1 fichier utilisé par un processus
    Par gregos dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/11/2005, 15h37
  5. Erreur "Fichier utilisé par un autre processus"
    Par solo3326 dans le forum Langage
    Réponses: 3
    Dernier message: 18/08/2005, 16h55

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