76 votes

Alignement C ++ lors de l’impression de cout <<

Existe-t-il un moyen d’aligner le texte lorsqu’on utilise un cout? J'utilise des tabulations, mais quand les mots sont trop gros, ils ne seront plus alignés

 Sales Report for September 15, 2010
Artist  Title   Price   Genre   Disc    Sale    Tax Cash
Merle   Blue    12.99   Country 4%  12.47   1.01    13.48
Richard Music   8.49    Classical   8%  7.81    0.66    8.47
Paula   Shut    8.49    Classical   8%  7.81    0.72    8.49
 

145voto

Herb Sutter Points 1511

Le standard ISO C++ façon de le faire est d' #include <iomanip> et l'utilisation io manipulateurs comme std::setw. Cependant, qui dit, ces io manipulateurs sont une vraie douleur à utiliser même pour le texte, et sont à peu près inutilisable pour la mise en forme de nombres (je suppose que vous voulez que vos montants de la ligne sur le décimal, le nombre correct de chiffres significatifs, etc.). Même pour de simples étiquettes de texte, le code ressemblera à quelque chose comme cela pour la première partie de votre première ligne:

// using standard iomanip facilities
cout << setw(20) << "Artist"
     << setw(20) << "Title"
     << setw(8) << "Price";
// ... not going to try to write the numeric formatting...

Si vous êtes en mesure d'utiliser les bibliothèques Boost, exécution (ne marche pas) et utiliser le Boost.Format de la bibliothèque de la place. Il est entièrement compatible avec la norme iostreams, et il vous donne tous les avantages pour faciliter la mise en forme avec printf/Posix chaîne de mise en forme, mais sans rien perdre de la puissance et la commodité de iostreams eux-mêmes. Par exemple, les premières parties de vos deux premières lignes ressemblerait à quelque chose comme:

// using Boost.Format
cout << format("%-20s %-20s %-8s\n")  % "Artist" % "Title" % "Price";
cout << format("%-20s %-20s %8.2f\n") % "Merle" % "Blue" % 12.99;

12voto

Eli Bendersky Points 82298

IO manipulateurs sont ce dont vous avez besoin. setw, en particulier. Voici un exemple tiré de la page de référence:

// setw example
#include <iostream>
#include <iomanip>
using namespace std;

int main () {
  cout << setw (10);
  cout << 77 << endl;
  return 0;
}

Justifiant le champ à gauche et à droite est fait avec l' left et right des manipulateurs.

Jetez aussi un oeil à setfill. Voici un autre tutoriel complet sur le formatage de sortie C++ avec io manipulateurs.

11voto

Loki Astari Points 116129

Voir aussi: http://stackoverflow.com/questions/119098/which-io-library-do-you-use-in-your-c-code/119194#119194

 struct Item
{
   std::string     artist;
   std::string     c;
   integer         price;  // in cents (as floating point is not acurate)
   std::string     Genre;
   integer         disc;
   integer         sale;
   integer         tax;
};

std::cout << "Sales Report for September 15, 2010\n"
          << "Artist  Title   Price   Genre   Disc    Sale    Tax Cash\n";
FOREACH(Item loop,data)
{
    fprintf(stdout,"%8s%8s%8.2f%7s%1s%8.2f%8.2f\n",
          , loop.artist
          , loop.title
          , loop.price / 100.0
          , loop.Genre
          , loop.disc , "%"
          , loop.sale / 100.0
          , loop.tax / 100.0);

   // or

    std::cout << std::setw(8) << loop.artist
              << std::setw(8) << loop.title
              << std::setw(8) << fixed << setprecision(2) << loop.price / 100.0
              << std::setw(8) << loop.Genre
              << std::setw(7) << loop.disc << std::setw(1) << "%"
              << std::setw(8) << fixed << setprecision(2) << loop.sale / 100.0
              << std::setw(8) << fixed << setprecision(2) << loop.tax / 100.0
              << "\n";

    // or

    std::cout << boost::format("%8s%8s%8.2f%7s%1s%8.2f%8.2f\n")
              % loop.artist
              % loop.title
              % loop.price / 100.0
              % loop.Genre
              % loop.disc % "%"
              % loop.sale / 100.0
              % loop.tax / 100.0;
}
 

10voto

codaddict Points 154968

La fonction manipulateur setw sera utile ici.

4voto

Alex Martelli Points 330805

Au moment où vous émettez la première ligne,

Artist  Title   Price   Genre   Disc    Sale    Tax Cash

pour atteindre "l'alignement", vous devez savoir "à l'avance" quelle est la largeur de chaque colonne doivent être (dans le cas contraire, l'alignement est impossible). Une fois que vous faire connaitre les besoins de la largeur de chaque colonne (il y a plusieurs façons possibles de réaliser que selon l'endroit où vos données en provenance de), puis l' setw fonction mentionné dans la réponse sera aider, ou, plus brutalement;-) vous pouvez émettre soigneusement calculé le nombre de places supplémentaires (maladroit, pour être sûr), etc. Je ne recommande pas les onglets de toute façon, tant que vous n'avez aucun contrôle réel sur la façon dont le périphérique de sortie final sera de rendre ceux-ci, en général.

Retour à la question centrale, si vous avez à chaque valeur de la colonne en vector<T> de la sorte, par exemple, vous pouvez effectuer une première phase de mise en forme afin de déterminer la largeur maximale de la colonne, par exemple (assurez-vous de prendre en compte la largeur de l'en-tête de la colonne, aussi, bien sûr).

Si vos lignes sont à venir "un par un", et l'alignement est cruciale, vous aurez à cache ou mémoire tampon les lignes d'arrivée (dans la mémoire) si elles correspondent, sinon sur un fichier de disque que vous aurez plus tard "rewind" et re-lire à partir du début), en prenant soin de garder à jour le vecteur de "maximum de la largeur de chaque colonne" en tant que lignes viennent. Vous ne pouvez pas afficher quoi que ce soit (pas même les têtes!), si le fait de garder l'alignement est crucial, jusqu'à ce que vous avez vu à la dernière ligne (à moins que vous en quelque sorte comme par magie, ont connaissance préalable des colonnes de largeurs, bien sûr;-).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X