7
votes

Formater la sortie de la console C ++

J'ai essayé de formater la sortie à la console pendant la période la plus longue et que rien ne se passe vraiment. J'essaie d'utiliser autant de iomenip code> comme je peux et des fonctions ofstream et code> Out.

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.
}


0 commentaires

4 Réponses :


2
votes

Vous pouvez écrire une procédure qui imprime toujours le même nombre de caractères à la sortie standard.

quelque chose comme: xxx

puis utiliser comme celui-ci dans votre programme: xxx


0 commentaires

3
votes

abandonner sur les onglets. Vous devriez pouvoir utiliser des manipulateurs IO pour définir la largeur de champ, le caractère de remplissage et le drapeau de format (pour obtenir une justification à gauche ou à droite). Utilisez les mêmes valeurs pour les en-têtes que vous le faites pour les données, et tout devrait sortir bien.

Aussi méfiez-vous que vous avez changé de note et d'acres dans votre exemple.


0 commentaires

20
votes

pense à cela comme utiliser Microsoft Excel :) Vous pensez à votre ruisseau comme champs. Vous définissez donc la largeur du champ, puis vous insérez votre texte dans ce champ. Par exemple: xxx

......

Texte alt

......

La largeur de champ ne signifie que la largeur du text + espaces . Vous pouvez remplir autre que des espaces: xxx

..... xxx

......

Je pense que le meilleur moyen est de comprendre votre format, écrivez un nouveau formateur qui fait tout ce que vous voulez: xxx < p> Si vous avez commencé à réfléchir à des manipulateurs paramétrés, seuls accepter un paramètre int ou long sont faciles à mettre en œuvre, d'autres types sont vraiment obscurs si vous n'êtes pas familier avec des flux de flux c ++ .


2 commentaires

+1 pour les manipulateurs IO standard (SETW & AL), +1 pour la définition d'une personnalisation iOMIP, -1 pour Excel


Et vous pouvez également limiter la taille de la chaîne à imprimer au cas où vous auriez de grandes chaînes (telles que les noms complets)



6
votes

Boost a une bibliothèque de format qui vous permet de formater facilement l'OVCUT comme l'ancien C Printf () mais avec la sécurité de type C ++.

N'oubliez pas que l'ancien C Printf () vous a permis de spécifier une largeur de champ. Cet espace remplit le champ si la sortie est sous-dimensionnée (note qu'il ne fait pas face à des champs sur-taille). P>

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


0 commentaires