2010-02-08 8 views
5

Comment obtenez-vous des colonnes "positionnées" avec cout, que leftaligns le texte et aligne les nombres à droite?Positionnement absolu en impression avec cout en C++?

#include <iostream> 
#include <iomanip> 
using namespace std; 

struct Human { 
    char name[20]; 
    char name2[20]; 
    char name3[20]; 
    double pts; 
}; 

int main() { 
    int i; 
    Human myHumen[3] = { 
     {"Mr", "Alan", "Turing", 12.25}, 
     {"Ms", "Ada", "Lovelace", 15.25}, 
     {"Sir", "Edgar Allan", "Poe", 45.25} 
    }; 
    cout << "Name1" << setw(22) << "Name2" << setw(22) << "Name3" << setw(22) << "Rating" <<endl; 
    cout << "-----------------------------------------------------------------------\n"; 
    for(i = 0; i < 3; i++) { 
     cout << myHumen[i].name << setw(22) << myHumen[i].name2 << setw(22) << myHumen[i].name3 << setw(20) << myHumen[i].pts << endl; 
    }//this didn't do nice printouts, with leftalign for text and rightalign with numbers 
} 
+2

Pouvez-vous fournir un exemple de sortie? – dirkgently

+0

Copie possible: http://stackoverflow.com/questions/275484/cout-formatting. Avez-vous également oublié d'ajouter 'left' après' setw'? – dirkgently

Répondre

6

Vous utilisez les manipulateurs "gauche" et "droite":

cout << std::left << std::setw(30) << "This is left aligned" 
    << std::right << std::setw(30) << "This is right aligned"; 

Un exemple avec du texte + numéros:

typedef std::vector<std::pair<std::string, int> > Vec; 
std::vector<std::pair<std::string, int> > data; 
data.push_back(std::make_pair("Alan Turing", 125)); 
data.push_back(std::make_pair("Ada Lovelace", 2115)); 

for(Vec::iterator it = data.begin(), e = data.end(); it != e; ++it) 
{ 
    cout << std::left << std::setw(20) << it->first 
     << std::right << std::setw(20) << it->second << "\n"; 
} 

qui imprime:

Alan Turing       125 
Ada Lovelace      2115 
+0

Je l'avais résolu moi-même en même temps que Roger. Quel changement pensez-vous que j'ai annulé? – Manuel

+0

Aussi, je ne vois aucune mention à 'std :: right' dans ce prétendu double. – Manuel

+0

Ah je dois avoir vu entre les modifications. – dirkgently

-1

Cela va être légèrement impopulaire, mais vous pouvez il suffit d'utiliser printf pour ce genre de programme rapide. Les chaînes de mise en forme sont plus faciles à comprendre et à utiliser (étant donné que quelqu'un utilise à la fois iostreams et printf).

#include <cstdio> 
#include <iostream> 
#include <iomanip> 
#include <string> 

struct Human { 
    char name[20]; // consider using std::string 
    char name2[20]; 
    char name3[20]; 
    double pts; 
}; 

int main() { 
    using namespace std; 
    Human people[3] = { 
    {"Mr", "Alan", "Turing", 12.25}, 
    {"Ms", "Ada", "Lovelace", 15.25}, 
    {"Sir", "Edgar Allan", "Poe", 45.25} 
    }; 
    printf("%-22s%-22s%-22s%20s\n", "Name1", "Name2", "Name3", "Rating"); 
    cout << string(22 * 3 + 20, '-') << '\n'; 
    for (int i = 0; i < 3; i++) { 
    Human const& h = people[i]; 
    printf("%-22s%-22s%-22s%20f\n", h.name, h.name2, h.name3, h.pts); 
    } 
    return 0; 
} 

Il est sûr (par défaut, voir std :: sync_with_stdio) pour mélanger et Cout printf, et un bon compilateur peut vérifier les types des chaînes de format pour vous aussi (-Wall dans gcc).

+0

Il n'est jamais une bonne idée de mélanger les E/S de style C et C++ (toute E/S avant que 'sync_with_stdio' ait une sémantique définie par l'implémentation jusqu'au point d'appel). Si vous enlevez le "cout" - c'est définitivement une alternative ;-) Note, vous pouvez déclarer le 'int i' dans la boucle' for'. En outre, une mention à propos de '#include ' ferait de cette douce. Mes 0,02 $. – dirkgently

+0

@dirk: J'ai quitté le cout pour montrer que vous pouvez les mélanger. Le point entier de sync_with_stdio existant est qu'il est sûr sauf si vous demandez explicitement le contraire (et ainsi peut-être obtenir un petit boost de performance), et il n'est * pas * défini par l'implémentation si vous ne l'appelez pas. (Ce qui est défini par l'implémentation, c'est l'appeler * après * sortie.) –

+0

J'ai également omis toute la première partie de son programme, ce qui fait que cela donne des erreurs si vous essayez de le compiler, mais vous avez raison, ce n'est pas trop de travail pour faire ce travail. –