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 :

[IO][stream] Opérateur >> et string


Sujet :

SL & STL C++

  1. #1
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut [IO][stream] Opérateur >> et string
    Salut,


    C'est encore moi... Et pour une question assez proche de la précédente (j'ai hésité à poster à la suite).

    Je me doute que l'opérateur >> doit appeller une méthode du style operator>>(), et ce coup-ci j'aimerais savoir comment elle fonctionne avec un string (et non pas un const char* ce coup-ci j'en suis sûr ).

    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ifstream in("out.cpp.txt");
     
    std::string line;
    for (int i=0; i<10000000; i++) {
        in >> line;
    }
    La ligne in >> line crée-t-elle un nouvel objet string ou bien modifie-t-elle la valeur de l'objet line existant ?


    Et plus globalement, est-ce que vous voyez quelques choses d'incorrect ou de problématique dans le code suivant (en particulier du coté performances), si ce n'est son utilité :
    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 < iostream >
    #include < fstream >
     
    int main(int argc, char *argv[]) {
        std::ofstream out("out.cpp.txt");
     
        for (int i=0; i<10000000; i++) {
            out << "Caraca, estou passando na posição " << i << std::endl;
        }
     
        out.close();
     
        std::ifstream in("out.cpp.txt");
     
        std::string line;
        for (int i=0; i<10000000; i++) {
            in >> line;
        }
     
        in.close();
    }


    a++

  2. #2
    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
    Elle modifie la valeur courante de l'objet line. En interne, peut-être qu'un nouvel objet est créé, mais on n'a pas à le savoir, ça dépend des implémentateurs

  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
    Citation Envoyé par adiGuba
    La ligne in >> line crée-t-elle un nouvel objet string ou bien modifie-t-elle la valeur de l'objet line existant?
    Elle modifie la valeur de l'objet line.

    Et plus globalement, est-ce que vous voyez quelques choses d'incorrect ou de problématique dans le code suivant (en particulier du coté performances), si ce n'est son utilité
    D'apres mon experience, getline sert plus de >> pour des string (ie on veut lire ligne par ligne et pas suivant une notion de mot que je n'arrive pas a retenir). En fait meme pour autre chose que des string, on commence a lire la ligne (ou plus) et on decode ensuite. Sinon, on n'arrive pas a donner de bons messages d'erreur.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Miles
    Elle modifie la valeur courante de l'objet line. En interne, peut-être qu'un nouvel objet est créé, mais on n'a pas à le savoir, ça dépend des implémentateurs
    Ok merci


    Citation Envoyé par Jean-Marc.Bourguet
    D'apres mon experience, getline sert plus de >> pour des string (ie on veut lire ligne par ligne et pas suivant une notion de mot que je n'arrive pas a retenir).
    Que veux-tu dire par là ? l'opérateur >> lit mot à mot et non pas ligne par ligne ???

    Donc si je veux lire le fichier ligne par ligne je devrais utiliser std:getline() ???
    C'est à dire faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for (int i=0; i<10000000; i++) {
            std:getline(int, line);
        }
    Merci

    a++

  5. #5
    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
    oui, l'opérateur >> lit mot par mot. Si tu veux lire ligne par ligne, tu dois utiliser getline() qui est une fonction membre de istream - et donc de std::cin, std::ifstream, ... -

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Miles
    oui, l'opérateur >> lit mot par mot. Si tu veux lire ligne par ligne, tu dois utiliser getline() qui est une fonction membre de istream - et donc de std::cin, std::ifstream, ... -
    Merci pour toutes ces informations qui vont m'être bien utile

    a++

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Miles
    oui, l'opérateur >> lit mot par mot. Si tu veux lire ligne par ligne, tu dois utiliser getline() qui est une fonction membre de istream - et donc de std::cin, std::ifstream, ... -
    Ne surtout pas utiliser la version membre, qui travaille avec un char*, mais bien la fonction libre comme adiGuba l'a fait

  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
    oups, pardon, je n'avais pas fait attention au prototype

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    D'autant qu'il n'y a aucun équivalent à GetBuffer() pour les strings standard...
    Ce qui oblige à passer par des char * quand on a une fonction qui demande ça...
    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.

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    D'autant qu'il n'y a aucun équivalent à GetBuffer() pour les strings standard...
    Ce qui oblige à passer par des char * quand on a une fonction qui demande ça...

    C'est quoi GetBuffer()?

    Voir std::basic_string::data()?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Dans la classe CString des MFC, la méthode CString::GetBuffer() prend une taille en paramètre et retourne un pointeur non-const: Elle donne un buffer inscriptible de la taille demandée, puis il suffit d'un appel à ReleaseBuffer() pour pouvoir à nouveau utiliser la CString comme une CString normale (avec ses fonctions de recherche, comparaison, etc).
    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.

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

Discussions similaires

  1. DirectSound et le streaming
    Par Shakram dans le forum DirectX
    Réponses: 57
    Dernier message: 09/06/2005, 11h05
  2. [BLOB]Enreg Stream dans Field
    Par sbeu dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/03/2004, 16h06
  3. Streaming video sous Linux
    Par freeshman dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 03/01/2004, 17h17
  4. Streaming fichier PDF
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 22/05/2003, 22h14
  5. Comment enregistrer un stream de longueur fixe ?
    Par Alcarbone dans le forum MFC
    Réponses: 5
    Dernier message: 13/04/2003, 20h14

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