6 votes

C++ comment justifier à droite plusieurs éléments de données

Je dois donc envoyer à std::cout une colonne de données où je dois également afficher des caractères autour des données, par exemple :

    Plot Points
   (0,0), (2,3) 
(1,10), (12,14)

où je dois justifier à droite la dernière parenthèse droite sous la lettre "s" en "Points" dans l'en-tête de la colonne.

Je mets les données comme :

cout << right << setw(12) << "(" << x1 << "," << y1 << "), (" << x2 << "," << y2 << ")";

Mais tous les exemples que j'ai vus semblent montrer que le droit et le setw semblent seulement affecter la prochaine pièce de données que j'envoie à cout donc, dans ce cas, la "(" seulement.

Existe-t-il un moyen de regrouper tous ces caractères et variables pour qu'ils soient tous justifiés ensemble dans la colonne de sortie ?

Je suis en train d'apprendre le C++, il y a peut-être une solution simple que je n'ai pas encore apprise ?

6voto

πάντα ῥεῖ Points 15683

Existe-t-il un moyen de regrouper tous ces caractères et variables pour qu'ils soient tous justifiés ensemble dans la colonne de sortie ?

Oui, vous pouvez utiliser une petite fonction d'aide pour construire une chaîne :

std::string parentized_pair(int x, int y) {
    std::ostringstream oss;
    oss << "(" << x "," << y << ")";
    return oss.str();
}

et utiliser celui-là dans la sortie finale :

cout << right << setw(12) << parentized_pair(x1,y1) 
     << right << setw(12) << parentized_pair(x2,y2);

2voto

Jerry Coffin Points 237758

L'une des possibilités consiste à formater les éléments qui composent un champ à l'aide d'un flux de chaînes de caractères, puis à écrire cette chaîne en respectant l'alignement droit.

2voto

Elyasin Points 3992

En ce qui concerne le champ d'ajustement, vous pouvez l'utiliser comme suit.

cout.setf(ios::right, ios::adjustfield);

En ce qui concerne width o setw Malheureusement, vous devrez le définir avant chaque sortie.

Consultez l'exemple suivant :

#include <iostream>

using namespace std;

int main () {
    cout<<"Current fill character: " << cout.fill() <<", code: " <<(int)cout.fill()<<endl;
    cout<<"Current field width : " << cout.width() <<endl;
    cout<<1<<2<<3<<endl;
    // changing width;
    cout.width(3);
    cout<<"Field width after change : " << cout.width() <<endl;
    cout<<1<<2<<3<<endl;
    cout<<"Width after output : " << cout.width() <<endl;
    // changing width and fill
    cout.width(3);
    cout.fill('_');
    cout<<"Current fill character: " << cout.fill() <<", code: " <<(int)cout.fill()<<endl;
    cout<<1<<2<<3<<endl<<endl;

    cout<<"Setting width before each write:\n";
    cout<<"adjustfield - not set/default:\n";
    for(unsigned i=1; i <= 3; ++i) {
        cout.width(3);
        cout<<i;
    }
    cout<<endl;

    cout<<"adjustfield - left:\n";
    cout.setf(ios::left, ios::adjustfield);
    for(unsigned i=1; i <= 3; ++i) {
        cout.width(3);
        cout<<i;
    }
    cout<<endl;

    cout<<"adjustfield - internal:\n";
    cout.setf(ios::internal, ios::adjustfield);
    for(unsigned i=1; i <= 3; ++i) {
        cout.width(3);
        cout<<i;
    }
    cout<<endl;

    cout<<"adjustfield - right:\n";
    cout.setf(ios::right, ios::adjustfield);
    for(unsigned i=1; i <= 3; ++i) {
        cout.width(3);
        cout<<i;
    }
    cout<<endl;
    return 0;
}
/*
Console output:

Current fill character:  , code: 32
Current field width : 0
123
Field width after change : 3
123
Width after output : 0
Current fill character: _, code: 95
123

Setting width before each write:
adjustfield - not set/default:
__1__2__3
adjustfield - left:
1__2__3__
adjustfield - internal:
__1__2__3
adjustfield - right:
__1__2__3
*/

Si vous pouvez fournir plus d'informations sur la structure de données que vous utilisez, ou si vous pouvez peut-être revoir la conception de votre structure de données, vous pourriez utiliser l'idée de la réponse de πάντα ῥεῖ, par exemple vous définissez une classe/structure Point et vous écrasez la classe. << pour un meilleur formatage.

1voto

C++ comment justifier à droite plusieurs éléments de données ?

Réponse rapide : séquentiellement et séparément pour chaque pièce.


Un bon début serait de se familiariser avec Manipulateurs d'E/S et leurs propriétés. Dans votre cas, lorsque vous appliquez setw il définit un indicateur de format et la valeur de cet indicateur n'est pas persistante ("collante"), mais elle est réinitialisée à sa valeur initiale. Pour une analyse plus approfondie de la raison pour laquelle setw semblent se réinitialiser après utilisation, voir ici.

Existe-t-il un moyen de regrouper tous ces caractères et variables pour qu'ils soient tous justifiés ensemble dans la colonne de sortie ?

Maintenant, pour votre problème spécifique, vous pouvez essayer d'insérer toutes vos données dans un fichier de type std::stringstream et ensuite appliquer la propriété recherchée une seule fois, comme indiqué dans les autres réponses.

Je suis en train d'apprendre le C++, il y a peut-être une solution simple que je n'ai pas encore apprise ?

La solution la plus simple serait d'écrire une fonction d'aide qui exécute la tâche souhaitée, il n'y a pas de fonction plus simple connue (pour moi) du langage C++ pour exécuter ce que vous voulez.


Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X