Pregunta Formatear la salida de la consola C ++


He estado tratando de formatear la salida a la consola durante más tiempo y nada está sucediendo realmente. He estado tratando de usar tanto de iomanip como puedo y el ofstream& funciones de salida

void list::displayByName(ostream& out) const
{
    node *current_node  = headByName;

    // I have these outside the loop so I don't write it every time.

    out << "Name\t\t" << "\tLocation" << "\tRating " << "Acre" << endl;
    out << "----\t\t" << "\t--------" << "\t------ " << "----" << endl;

    while (current_node)
    {
        out << current_node->item.getName() // Equivalent tabs don't work?
            << current_node->item.getLocation()
            << current_node->item.getAcres()
            << current_node->item.getRating()
            << endl;

        current_node = current_node->nextByName;
    }

    // The equivalent tabs do not work because I am writing names,
    // each of different length to the console. That explains why they
    // are not all evenly spaced apart.
}

¿Hay algo que pueda usar para que todo esté alineado correctamente el uno con el otro? Las funciones que estoy llamando se explican por sí mismas y todas tienen diferentes longitudes, por lo que no se alinean muy bien entre sí.

Intenté casi todo en iomanip.


7
2017-09-19 23:44


origen


Respuestas:


Puede escribir un procedimiento que siempre imprima el mismo número de caracteres a la salida estándar.

Algo como:

string StringPadding(string original, size_t charCount)
{
    original.resize(charCount, ' ');
    return original;
}

Y luego usa esto en tu programa:

void list::displayByName(ostream& out) const
{
    node *current_node  = headByName;

    out << StringPadding("Name", 30)
        << StringPadding("Location", 10)
        << StringPadding("Rating", 10)
        << StringPadding("Acre", 10) << endl;
    out << StringPadding("----", 30)
        << StringPadding("--------", 10)
        << StringPadding("------", 10)
        << StringPadding("----", 10) << endl;

    while ( current_node)
    {
        out << StringPadding(current_node->item.getName(), 30)
            << StringPadding(current_node->item.getLocation(), 10)
            << StringPadding(current_node->item.getRating(), 10)
            << StringPadding(current_node->item.getAcres(), 10)
            << endl;
        current_node = current_node->nextByName;
    }
}

2
2017-09-20 00:01



Piénsalo como usar Microsoft Excel :) Piensas en tu transmisión como campos. Entonces, primero establece el ancho del campo y luego inserta el texto en ese campo. Por ejemplo:

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

int main()
{
    using namespace std;

    string firstName = "firstName",
            secondName = "SecondName",
            n = "Just stupid Text";
    size_t fieldWidth = n.size(); // length of longest text

    cout << setw(fieldWidth) << left << firstName << endl // left padding
         << setw(fieldWidth) << left << secondName << endl
         << setw(fieldWidth) << left << n << endl;

    cout << setw(fieldWidth) << right << firstName << endl // right padding
         << setw(fieldWidth) << right << secondName << endl
         << setw(fieldWidth) << right << n << endl;
}

......

alt text

......

El ancho del campo no significa más que el ancho del text + spaces. Tú podrías fill cualquier cosa que no sean espacios:

string name = "My first name";
cout << setfill('_') << setw(name.size() + 10) << left << name;

.....

output::
My first name__________

......

Creo que la mejor manera es averiguar su formato y luego escribir un nuevo formateador que haga todo lo que quiera:

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

std::ostream& field(std::ostream& o)
{
    // usually the console is 80-character wide.
    // divide the line into four fields.
    return o << std::setw(20) << std::right;
}

int main()
{
    using namespace std;

    string firstName = "firstName",
            secondName = "SecondName",
            n = "Just stupid Text";
    size_t fieldWidth = n.size();

    cout << field << firstName << endl
         << field << secondName << endl
         << field << n << endl;
}

Si comenzó a pensar en manipuladores parametrizados, solo acepta uno int o long Los parámetros son fáciles de implementar, otros tipos son realmente oscuros si no está familiarizado con las transmisiones en C++.


15
2017-09-20 00:29



Boost tiene una biblioteca de formato que le permite formatear fácilmente la salida de datos como la antigua C printf () pero con seguridad de tipo C ++.

Recuerde que el antiguo C printf () le permitió especificar un ancho de campo. Este espacio llena el campo si la salida es de tamaño insuficiente (obsérvese que no se ocupa de campos sobredimensionados).

#include <iostream>
#include <iomanip>
#include <boost/format.hpp>

struct X
{  // this structure reverse engineered from
   // example provided by 'Mikael Jansson' in order to make this a running example

    char*       name;
    double      mean;
    int         sample_count;
};
int main()
{
    X   stats[] = {{"Plop",5.6,2}};

    // nonsense output, just to exemplify

    // stdio version
    fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
            stats, stats->name, stats->mean, stats->sample_count);

    // iostream
    std::cerr << "at " << (void*)stats << "/" << stats->name
              << ": mean value " << std::fixed << std::setprecision(3) << stats->mean
              << " of " << std::setw(4) << std::setfill(' ') << stats->sample_count
              << " samples\n";

    // iostream with boost::format
    std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")
                % stats % stats->name % stats->mean % stats->sample_count;
}

6
2017-09-20 00:31



Renunciar a las pestañas. Debería poder usar manipuladores de E / S para establecer el ancho del campo, el carácter de relleno y el indicador de formato (para obtener la justificación a la izquierda o a la derecha). Use los mismos valores para los títulos que para los datos, y todo debería salir bien.

También ten cuidado de que hayas cambiado Clasificación y Hectáreas en tu ejemplo.


3
2017-09-20 00:09