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 :

Tabulation sur bloc entier de lignes dans cout


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut Tabulation sur bloc entier de lignes dans cout
    Bonsoir,

    J'effectue ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cout << "Nom        : " << nom << endl;
    cout << "Prenom     : " << prenom << endl;
    cout << "Autres     : " << personne.getOtherInfos() << endl;
    Avec nom, prenom des string.
    La méthode getOtherInfos renvoi un string dont la représentation est :
    "Information 1 : aaa" << endl
    "Information 2 : bbbbbb" << endl
    "Information 3 : cccc" << endl

    L'idée serait d'avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom        : Albert
    Prenom     : Claude
    Autres     : Information 1 : aaa
    	     Information 2 : bbbbbb
    	     Information 3 : cccc
    Mais moi j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom        : Albert
    Prenom     : Claude
    Autres     : Information 1 : aaa
    Information 2 : bbbbbb
    Information 3 : cccc
    La méthode getOtherInfos() peut être appelée sans être précédée de l'affichage du Nom et Prenom. Donc, je ne peux pas rajouter des tabulations dans getOtherInfos().
    Auriez-vous une idée ? Est-ce possible de faire une tabulation sur un bloc entier de lignes dans cout ?

    J'ai déjà regardé du côté de setw et setfill mais ça n'arrange pas mon problème vu que je ne peux pas modifier getOtherInfos() dynamiquement..


    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    passer un paramètre à getOtherInfos ne serait-il pas possible ?
    Simple et suffisant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    J'aimerais tant ^^ Mais non ce n'est pas possible
    Et rien que l'idée de devoir toucher à la position du curseur dans la console m'hérisse les poils ^^'

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    En théorie, '\n' qui est envoyé par std::endl signifie "va à la prochaine ligne en laissant le curseur dans la même position", c'est-à-dire qu'il ne remet le curseur à gauche.
    Dans la pratique, '\n' est systématiquement transformé en "va à la prochaine ligne ET remet le curseur à gauche".

    Peut-être il y a moyen de rétablir ce comportement en jouant avec les std::ostream dont std::cout en est une instance.

    Ça demande quelques recherches.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Je suis justement en train de regarder ^^ Je me demandais si il n'y avait pas possibilité de modifier le comportement de endl entre deux cout.. Mais rien de bien probant ni qui fonctionne:s

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    C'est bon, j'ai trouvé une méthode de bras cassés..

    La méthode :
    * Je met personne.getOtherInfos() dans un stringstream
    * Je récupère les lignes du stringstream à coups de getline(stringstream, buffer, '\n')
    * Pour chaque ligne, je fais un cout << "\t" << buffer << endl;

    Si vous avez une meilleure solution, je suis ouvert

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je ne suis pas expert des flux d'entrée/sortie, mais tu dois avoir moyen, au début de ta fonction, de récupérer la position courante par rapport au début du tampon (tellp ?).
    Si c'est le cas, tu n'auras plus ensuite qu'à remplir le début des lignes suivantes d'un nombre d'espaces correspondant.

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    En fait, le problème se situe au niveu de getOtherInfos().

    Si tu ne peux pas te permettre de modifier cette fonction (et je te déconseillerais d'ailleurs de le faire), c'est que tu n'utilises pas la "bonne" méthode pour récupérer les informations que tu veux obtenir.

    Si j'ai bien compris, getOtherInfos() est une fonction qui parcoure "un certain nombre d'informations" et qui crée une chaine de caractères qui correspond à la concaténation de toutes ces informations en les séparant par un retour à la ligne.

    La première question qu'il faudrait se poser est donc :
    est ce que cela correspond réellement à un service que l'on est en droit d'attendre de la part de la classe
    Et il faudrait se la poser d'autant plus qu'elle dénote déjà que le développeur qui a implémenté cette fonction semblait avoir une idée très précise de la manière dont cette information devra être utilisée.

    J'aurais personnellement tendance à estimer que l'implémentation de cette fonction est beaucoup trop spécifique à une utilisation bien particulière et que, si elle est utile, ce n'est pas forcément une raison pour en faire une fonction membre. Mais seul le développeur de la fonction serait éventuellement en mesure de nous en dire d'avantage.

    La deuxième question qu'il faut se poser, étant donné que cette fonction ne correspond visiblement absolument pas à ce dont on a besoin, c'est:
    Quels sont mes propres besoins dans le cas présent
    La réponse à cette question tient en deux phases :
    1. Tu veux pouvoir récupérer une paire "clé / valeur" dont la clé correspond à une chaine de caractères représentant le nom d'une information et dont la valeur correspond à une chaine de caractères représentant l'information en elle-même, et surtout,
    2. Tu veux pouvoir récupérer l'ensemble des pair clé / valeur dont la personne est "dépositaire".

    Cela nous mène donc à nous poser une troisième question:
    Est ce que le fait de pouvoir récupérer une pair clé / valeur correspondant à une clé spécifique correspond à un service que l'on est en droit d'attendre de la part de la classe Personne
    voire
    Est ce que le fait de pouvoir récupérer la valeur associée à une clé spécifique correspond à un service que l'on est en droit d'attendre de la part de la classe Personne
    A priori, je répondrais "oui" aux deux questions, car il semble évident que, si on peut définir ces informations pour une personne, c'est que ces informations font "partie intégrante" des propriétés de la personne, et qu'il faut donc sans doute être en mesure de les récupérer.

    Mais cela nous mène donc à nous poser une quatrième question:
    S'agit-t-il d'un ensemble fini et clairement déterminé d'informations (par exemple : téléphone 1, gsm, mail, website et quelques autres) ou d'un ensemble d'information don le nombre et les clés peuvent varier d'une personne à l'autre
    La réponse à cette question est spécifique à ton projet. Il m'est donc impossible de décider de la meilleure réponse à y apporter

    Dans le premier cas, il y a des chances pour que la classe Personne présente un comportement spécifique permettant de récupérer à chaque fois la valeur d'une clé spécifique (des "getters" proches de getPhone1, getMail, getCellular, getWebSite, ...) qui seront sans doute autant de services sur lesquels tu pourrait appuyer une logique externe à ta classe.

    Dans le second cas, on est sans doute en droit d'attendre un service de la part de la classe Personne qui corresponde au fait de fournir un intervalle d'itérateurs compris entre la première information valide et "ce qui suit" la derniière clé valide inclus (typiquement, des fonctions équivalent aux fonctions begin() et end() de la collection dans laquelle les valeurs sont maintenues) étant entendu que chaque itérateur valide renverrait une nouvelle paire "clé = valeur".

    Note d'ailleurs que ce service particulier pourrait très bien être parfaitement cohérent dans le premier cas. Disons juste que son besoin est alors... moins impératif .
    (oups, je me suis trompé de bouton, je voulais prévisualiser )

    A partir de là, la question dernière question sera triviale :
    Est-ce que la classe Personne te fournit les services suffisants pour te permettre de récupérer chaque information de manière séparée
    En gros, la réponse est "oui" dans le premier cas si elle te fournit l'ensemble des accesseurs aux différentes informations et "oui" dans le second cas si elle t'expose des comportements comme begin() et end() qui renvoient un itérateur sur les paires clé = valeur.

    Si La réponse est "oui", tu es sauvé car tu pourras implémenter ta propre logique, sinon, il est possible (mais pas forcément obligatoire) que ta classe Personne présente "un manque conceptuel".

    Comprends : le fait que le développeur n'a pas forcément pensé à l'ensemble minimal des services que l'on serait en droit d'attendre de la part de la classe, bien qu'il ait, visiblement, pensé à un service trop spécifique (je pense à la fonction getOtherInfos() ) pour être réellement utile.

    Si je dis que tu es sauvé, c'est parce que, d'une manière ou d'une autre, tu seras en mesure d'implémenter la fonction d'affichage qui te convient!

    Dans le premier cas, cela pourrait ressembler à
    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
    bool found = false;
    cout << "Nom        : " << nom << endl;
    cout << "Prenom     : " << prenom << endl;
    if(! personne.getPhone1().empty()){
        cout << "Autres     : "<<"phone :" << personne.getPhone1() << endl;
        found = true;
    }
    if(!personne.getMail().empty()){
        if(! found)
            cout << "Autres     : ";
        else
            cout << "           : ";
        cout<<"mail :"<<personne.getMail()<<:std::endl;
        found = true;
    }
    if(!personne.getWebSite().empty()){
        if(! found)
            cout << "Autres     : ";
        else
            cout << "           : ";
        cout<<"website :"<<personne.getWebSite()<<:std::endl;
        found = true;
    }
    /* ... */
    Dans le second cas, la logique pourrait ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    bool found = false;
    cout << "Nom        : " << nom << endl;
    cout << "Prenom     : " << prenom << endl;
    auto it = personne.begin();
    while(it!= personne.end()){
     
        if(! found)
            cout << "Autres     : ";
        else
            cout << "           : ";
        cout<<it->first<<" : "<<it->second<<std::endl;
        ++it;
        found = true;
    }
    (avec, au besoin, quelques "mises en page" supplémentaires )

    Mais, au final, tu arriverais donc "assez facilement" à obtenir le résultat souhaité
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Points : 70
    Points
    70
    Par défaut
    Merci pour ta réponse.
    Pour faire simple, une information pour une personne est une classe.
    Dans cette classe, on définit une fonction ToString() qui permet de récupérer la version string de l'objet.
    Donc plus bas, sur le premier exemple, j'ai raccourci le code, mais à la place de nom, on a : nom.ToString();

    On définit également une classe OtherInfo dont les membres privés sont :
    Information Information1
    Information Information2
    Information Information3
    Là il y a une méthode GetOtherInfos qui fait la concaténation dans un string des informations membres de la classe.

    Une personne est définie comme ayant les membres privés:
    Information Nom
    Information Prenom
    OtherInfo Autres

    Jusque là, ça ne vient pas de moi, on me le donne.

    Et moi, je dois m'occuper de la classe Personne dont on me demande d'implémenter une méthode public Afficher(void);
    Voilà où j'en suis. Je ne peux pas modifier les autres classes.
    L'idée de prendre Information par Information et de les afficher par moi même est une bonne idée.. Mais ce n'est pas l'objectif.
    On me demande d'utiliser les méthodes ToString() pour une information et GetOtherInfos() pour une OtherInfo.
    Sans doutes car ces méthodes peuvent être sujets à des modifications futures et que Affiche() ne doit pas en être dépendant..

    Je ne sais pas si je t'ai correctement répondu Koala, mais j'ai donné le max d'info que j'avais.
    Donc pour l'instant je vais me cantonner à ce que j'avais écris plus haut, à savoir extraire les lignes et rajouter des tab puis insérer dans cout.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Dés lors, la question est : quelles sont les fonctions de OtherInfo que tu pourrais utiliser pour arriver au résultat qui t'intéresse, sachant que la fonction getOtherInfos() ne correspond pas à tes besoins

    Evidemment, sans savoir à quoi correspond cette classe, il sera pour le moins difficile de te donner une réponse
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Super réponse de Koala.

    On ne peut tout de même pas t'inderdire d'utiliser les membres publics des classes que tu manipules .

    A moins que ToString() soit censée être une sortie "parsable" et que l'exercice soit justement de la parser, ce ne serait pas juste de te refuser des accesseurs const sur les objets, et il serait étonnant qu'il n'y en ai pas . Au pire ton hack fonctionne mais c'est dommage.

    Y a-t-il un contexte multithreadé qui justifierait un contrôle strict de l'accès au données membres ?
    Find me on github

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    En fait, ce qu'il serait intéressant d'avoir pour pouvoir te donner une réponse correcte, c'est la liste des fonctions membres de la classe OtherInfos.

    Comme je te l'ai dit plus haut, la fonction GetOtherInfos n'est visiblement pas adaptée à ton problème!

    Donc, s'il existe une solution, elle se situe au niveau des autres (fonctions) membres publics dont tu disposes.

    Et si on ne trouve rien qui puisse nous aider dans la résolution de ton problème dans la liste des (fonctions) membres publics de OtherInfos, ben, ta solution de bras cassés sera la "meilleure solution du moment", en attendant que le développeur de la classe ait revu sa copie
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/12/2011, 17h22
  2. Texte sur plusieurs lignes dans un TListBox
    Par BigBenQ dans le forum Composants VCL
    Réponses: 1
    Dernier message: 04/05/2006, 17h58
  3. Texte sur plusieurs lignes dans une cellule de JTable
    Par JeanECN dans le forum Composants
    Réponses: 3
    Dernier message: 10/04/2006, 17h20
  4. [jtable] Champs texte sur pls ligne dans cellule
    Par doudine dans le forum Composants
    Réponses: 8
    Dernier message: 17/11/2005, 12h36
  5. Réponses: 2
    Dernier message: 21/09/2005, 12h18

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