2010-02-08 11 views
5

Come si ottengono colonne "posizionate in modo assoluto" con cout, che allineano il testo e i numeri con allineamento a destra?Posizionamento assoluto nella stampa con cout in 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

Potete fornire qualche esempio di output? – dirkgently

+0

Eventuale duplicato: http://stackoverflow.com/questions/275484/cout-formatting. Hai anche dimenticato di aggiungere 'left' dopo' setw'? – dirkgently

risposta

6

si utilizza l'e "destra" manipolatori "sinistra":

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

Un esempio con i numeri di testo +:

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"; 
} 

che stampa:

Alan Turing       125 
Ada Lovelace      2115 
+0

L'avevo riparato contemporaneamente a Roger. Che cambiamento pensi che abbia annullato? – Manuel

+0

Inoltre, non vedo alcuna menzione a 'std :: right' in quel presunto duplicato. – Manuel

+0

Ah Devo aver visto tra le modifiche. – dirkgently

-1

Questo sarà leggermente impopolare, ma puoi farlo basta usare printf per questo tipo di programma rapido. Le stringhe di formattazione sono più facili da capire e da usare (dato a qualcuno che gira sia iostreams che 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; 
} 

E 'sicuro (per impostazione predefinita, vedere std :: sync_with_stdio) per miscelare cout e printf, e un buon compilatore può controllare i tipi di stringhe di formato anche per te (-Wall in GCC).

+0

Non è mai una buona idea mescolare gli i/o di stile C e C++ (qualsiasi i/o prima che 'sync_with_stdio' abbia una semantica definita dall'implementazione fino al punto di chiamata). Se togli il "cout" randagio-- questa è sicuramente un'alternativa ;-) Nota, puoi dichiarare il 'int i' nel ciclo' for'. Inoltre, una citazione su "#include " renderebbe questo dolce. I miei $ 0,02. – dirkgently

+0

@dirk: ho lasciato il cout in per mostrare che è possibile mescolarli. L'intero punto di sync_with_stdio esistente è che è sicuro a meno che tu non richieda esplicitamente il contrario (e quindi possibilmente ottenga un piccolo incremento di prestazioni), ed è * non * definito dall'implementazione se non lo chiami. (Ciò che è definito dall'implementazione è chiamandolo * dopo * output.) –

+0

Ho anche omesso l'intera prima parte del suo programma, il che rende questo errore se si tenta di compilarlo, ma hai ragione non è tanto lavoro per far funzionare questo –

Problemi correlati