2010-02-08 16 views
5

¿Cómo se obtienen las columnas "absolutamente posicionado" con cout, que leftalinea el texto y los números se alinean a la derecha?Posicionamiento absoluto en la impresión con 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

¿Puede proporcionar algún ejemplo de salida? – dirkgently

+0

Posible duplicado: http://stackoverflow.com/questions/275484/cout-formatting. ¿También olvidaste agregar 'left' after' setw'? – dirkgently

Respuesta

6

utiliza el y manipuladores de "izquierda", "derecha":

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

un ejemplo con números de texto +:

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

que imprime:

Alan Turing       125 
Ada Lovelace      2115 
+0

Lo había arreglado al mismo tiempo que Roger. ¿Qué cambio crees que he deshecho? – Manuel

+0

Además, no veo ninguna mención a 'std :: right' en ese supuesto duplicado. – Manuel

+0

Ah, debo haberlo visto entre ediciones. – dirkgently

-1

Esto va a ser un poco impopular, pero puedes solo use printf para este tipo de programa rápido. Las cadenas de formato son más fáciles de entender y usar (dado que alguien compila tanto iostreams como 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; 
} 

Es seguro (por defecto, ver std :: sync_with_stdio) para mezclar cout y printf, y un buen compilador puede comprobar los tipos de las cadenas de formato para usted, también (-Wall en gcc).

+0

Nunca es una buena idea mezclar E/S estilo C y C++ (cualquier E/S antes de que 'sync_with_stdio' tenga una semántica definida por la implementación hasta el momento de la llamada). Si sacas el 'cout' perdido - esta es definitivamente una alternativa ;-) Nota, puedes declarar el' int i' en el bucle 'for'. Además, una mención sobre '#include ' lo haría dulce. Mi $ 0.02. – dirkgently

+0

@dirk: dejé la frase para mostrar que puedes mezclarlos. El objetivo de sync_with_stdio es que es seguro a menos que solicite explícitamente lo contrario (y, por lo tanto, posiblemente obtenga un pequeño incremento en el rendimiento), y está * no * definido en la implementación si no lo llama. (Lo que está definido por la implementación es llamarlo * después * de salida.) –

+0

También dejé fuera toda la primera parte de su programa, lo que hace que esto dé errores si intenta compilarlo, pero tiene razón, no es tanto trabajo para hacer que esto funcione –

Cuestiones relacionadas