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 :

Utilité du manipulateur std::ends


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut Utilité du manipulateur std::ends
    Dans quel cas peut-on trouver une utilité quelconque au manipulateur std::ends, qui ajoute un caractère nul dans un flux sortant ?
    Dans quel cas a-t-on intérêt à écrire ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "Dugommier"  << std::ends ...
    plutôt qu'un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << "Dugommier" ...

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    L'utilité est rare mais permet de mettre le caractère \0 dans un stream.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include <cstdlib>
     
    int main()
    {
      std::cout << "123 \0 456" << std::endl;
      std::cout << "abc " << std::ends << " def" << std::endl;
     
      return EXIT_SUCCESS;
    }
    Cela donne à l’exécution (@ represente le caractère \0 ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ teststdends.cpp -o teststdends.exe && teststdends.exe
    123 
    abc @ def
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Je comprends mieux ma perplexité : la représentation du caractère nul '\0' à l'affichage doit dépendre des systèmes, chez moi (Linux, console Gnome Terminal), il n'est représenté dans la sortie par absolument rien (sauf bien sûr qu'il 'coupe' une chaîne à la C). Ainsi un programme comme le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
     
    int main()
    {
      std::cout << "123 \0 456" << std::endl;
      std::cout << "abc" << std::ends << "def" << std::endl;
      std::cout << "abc" << '\0' << "def" << std::endl;
    }
    aboutit à la sortie suivante :
    Je ne vois donc toujours pas très bien dans quelle situation l'utilisation de ce manipulateur serait utile...

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    L'ajout du '\0' ne permet-il pas de faire comme endl qui en plus d'aller à la ligne suivante écrit le contenu du buffer et le vide ?

  5. #5
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Neckara Voir le message
    L'ajout du '\0' ne permet-il pas de faire comme endl qui en plus d'aller à la ligne suivante écrit le contenu du buffer et le vide ?
    je ne crois pas que ends flush le buffer, à vérifier.
    Citation Envoyé par http://www.cplusplus.com/reference/iostream/manipulators/ends/
    Inserts a null character ('\0').
    Citation Envoyé par http://www.cplusplus.com/reference/iostream/manipulators/endl/
    Insert newline and flush
    Inserts a new-line character.
    Additionally, for buffered streams, endl flushes the buffer (i.e. writes all unwritten characters in the buffer to the output sequence, see ostream::flush).

    Citation Envoyé par ptyxs
    Je comprends mieux ma perplexité : la représentation du caractère nul '\0' à l'affichage doit dépendre des systèmes, chez moi (Linux, console Gnome Terminal), il n'est représenté dans la sortie par absolument rien (sauf bien sûr qu'il 'coupe' une chaîne à la C). Ainsi un programme comme le suivant :
    Chez moi c'etait un terminal emacs et ce n’était pas exactement @ mais réellement un \0 (Tu l'obtiens aussi en raccourcis avec C-q C-espace) qui était visible.

    Je pense qu'un terminal classique vas couper la chaine et pas forcément représenter le caractère.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Dans le document C++_Standard_n3242_2011.pdf, je trouve ceci qui ne suggère pas que ends flushe [du moins si put(char_type c), la fonction appelée par ends, ne flushe pas elle-même, ce que la définition de endl ne suggère pas (endl appelle put(char_type c) puis appelle flush(), ce qui suggère que put(char_type c) ne flushe pas elle-même)] :

    27.7.3.8
    Standard basic_ostream manipulators [ostream.manip]


    namespace std {
    template <class charT, class traits>
    basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
    }
    Effects: Calls os.put(os.widen(’\n’)), then os.flush().
    Returns: os.

    namespace std {
    template <class charT, class traits>
    basic_ostream<charT,traits>& ends(basic_ostream<charT,traits>& os);
    }
    Effects: Inserts a null character into the output sequence: calls os.put(charT()).
    Returns: os.

    namespace std {
    template <class charT, class traits>
    basic_ostream<charT,traits>& flush(basic_ostream<charT,traits>& os);
    }
    Effects: Calls os.flush().
    Returns: os.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    ends est concu pour etre utilise avec les strstream (qui renvoient un char* et donc on a souvent besoin de terminer la chaine explicitement avec un \0).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    ...et les strstream sont considérés comme « deprecated » au profit des stringstream qui renvoient une std::string...
    http://stackoverflow.com/questions/2...eam-deprecated

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Je comprends mieux ma perplexité : la représentation du caractère nul '\0' à l'affichage doit dépendre des systèmes, chez moi (Linux, console Gnome Terminal), il n'est représenté dans la sortie par absolument rien (sauf bien sûr qu'il 'coupe' une chaîne à la C). Ainsi un programme comme le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
     
    int main()
    {
      std::cout << "123 \0 456" << std::endl;
      std::cout << "abc" << std::ends << "def" << std::endl;
      std::cout << "abc" << '\0' << "def" << std::endl;
    }
    aboutit à la sortie suivante :
    Si tu veux mieux voir les caractères émis par ton programme, tu peux le piper avec od:


Discussions similaires

  1. Utilité de With/End With ?
    Par OtObOx dans le forum Général VBA
    Réponses: 4
    Dernier message: 27/02/2011, 01h30
  2. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  3. Objets dérivé de std::ostream et manipulateur
    Par Sub dans le forum SL & STL
    Réponses: 2
    Dernier message: 03/10/2007, 06h26
  4. Front End graphique pour GDB sous windows
    Par KORTA dans le forum GDB
    Réponses: 8
    Dernier message: 20/08/2003, 09h52
  5. utilité du binaire et hexadecimaux?
    Par souris78 dans le forum C
    Réponses: 9
    Dernier message: 01/07/2003, 15h08

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