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 :

Extraire une ligne d'un buffer


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut Extraire une ligne d'un buffer
    Bonjour à tous

    Après avoir placé un fichier en mémoire, je tente d'en extraire (au moins) une ligne.

    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
     
    #include <fstream> 
    #include <iostream> 
    #include <sstream> 
     
    int main() 
    { 
        std::ifstream fichier( "config.ini" ); 
        std::stringstream buffer;
     
        buffer << fichier.rdbuf(); 
        fichier.close(); 
     
        std::cout << buffer.str().getline() << std::endl; // error : std::basic_stringstream<char>::__string_type' has no member named 'getline'
        std::cout << buffer.getline() << std::endl; // error: no matching function for call to 'std::basic_stringstream<char>::getline()
    }
    J'ai placé les erreurs renvoyées en commentaire.

    Dans le premier cas il n'y aurait pas de membre du nom de getline. Pourtant un appel tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << buffer.str().find("test") << std::endl;
    fonctionne très bien. Et lorsque je lis le référentiel il existe bien pour string une méthode surchargée getline.


    Pour le second cas, il ne trouve pas de fonction correspondante pour getline alors que la aussi, il existe une fonction getline héritée de istream selon le référentiel.


    Il semblerait que je n'ai pas fourni d'arguments alors qu'il en faudrait dans le premier cas 3 et dans le second 2 selon les propositions candidates.

    Comment puis-je alors écrire correctement ces appels pour simplement, extraire une ligne et l'afficher ?

    Merci de vos conseils.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le "bon" getline() du C++ est une fonction libre, et non un membre de classe.

    Tu peux essayer ceci:
    Code C++ : 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 <fstream> 
    #include <iostream> 
    #include <sstream> 
    #include <string>
     
    int main() 
    { 
    	std::ifstream fichier( "config.ini" ); 
    	std::stringstream buffer;
     
    	buffer << fichier.rdbuf(); 
    	fichier.close(); 
     
    	std::string line;
    	std::getline(buffer, line);
    	std::cout << line << std::endl;
     
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    find est une méthode/fonction d'instance : http://www.cplusplus.com/reference/string/string/find/
    getline est une fonction libre : http://www.cplusplus.com/reference/s...tring/getline/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    Ca marche bien.

    Mais j'en conclus donc on ne peut pas lire une ligne en direct à partir du buffer et qu'il faut passer par une variable string intermédiaire, même si l'on applique au buffer un .str().

    Concernant cette différentiation fonction libre vs membre de classe, pouvez-vous me précisez pourquoi ici : http://www.cplusplus.com/reference/s.../stringstream/, on a bien un getline dans la section "Public member functions inherited from istream" et pourquoi je ne peux directement l'utiliser sur buffer qui est un stringstream tel que je vous ai présenté ?

    Merci à vous deux.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le getline() de stream est un des "mauvais" getline() de C++: Ceux qui bossent sur des tableaux de caractères au lieu de remplir une string.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    Merci Medinoc.

    En synthèse, pour une même fonction, privilégier "function" à "public member function".

    Ca ne simplifie pas les choses tout ça.


  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par KonTiKI Voir le message
    En synthèse, pour une même fonction, privilégier "function" à "public member function".
    ABSOLUMENT PAS!

    Il n'y a pas de règle simple pour ça. Il faut juste savoir que pour getline(), spécifiquement pour getline(), c'est la fonction libre qu'il faut utiliser.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Par défaut
    C'est bien noté.

    Merci.

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

Discussions similaires

  1. [MySQL] Extraire une ligne de la bdd
    Par bassiste dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 26/06/2008, 15h43
  2. [MySQL] extraire une ligne mysql à l'aide d'un $_get
    Par valvalval dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 25/06/2008, 18h56
  3. extraire une ligne positionnée dans X fichiers
    Par AlexFred dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2008, 17h42
  4. Extraire Une Ligne Du Fichier
    Par chakcc dans le forum C
    Réponses: 2
    Dernier message: 16/10/2006, 11h45
  5. Scripts : Extraire une ligne
    Par nemohck dans le forum Linux
    Réponses: 7
    Dernier message: 03/11/2003, 20h40

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