Centre de texte de largeur fixe de terrain avec ruisseau des manipulateurs en C++
Je suis refactoring un code existant qui est à l'aide de printf
à longues chaînes (sans mise en forme) à imprimer texte brut en-têtes de tableau qui semble théoriquement comme ceci:
| Table | Column | Header |
qui sont actuellement en production comme ceci:
printf("| Table | Column | Header |");
Je voudrais produire de la ci-dessus avec le code de l'effet de1:
outputStream << "|" << std::setw(10) << std::center << "Table"
<< "|" << std::setw(10) << std::center << "Column"
<< "|" << std::setw(9) << std::center << "Header"
<< "|" << std::endl;
qui ne compile pas car <iomanip>
a le flux des manipulateurs std::left
, std::right
et std::internal
, mais ne semble pas avoir de std::center
. Est-il un moyen propre de faire cela déjà dans les bibliothèques C++ standard, ou vais-je avoir à calculer manuellement l'espace nécessaire?
1Même si c'est plus détaillé que le code C, il sera moins détaillé dans le long terme, parce que le nombre de printf
consolidés et le montant de infixés les chevauchements dans leurs cordes. Il sera également plus extensible et facile à entretenir.
OriginalL'auteur Keith Pinson | 2013-02-13
Vous devez vous connecter pour publier un commentaire.
Voici une classe d'assistance que d'accomplir ce que vous voulez:
Il est utilisé simplement en appelant
centered("String")
, comme suit:Est-ce bien seulement pour C++0x? Dans MSVS 2010 j'obtiens un "modèle par défaut arguments ne sont autorisés que sur un modèle de classe". Selon ce AFIN de répondre cela a été corrigé dans C++0x.
Étrange. Il fonctionne parfaitement bien dans Clang. Sur la ligne 24, essayez de supprimer le modèle par défaut du paramètre, il est donc juste
template<typename charT, typename traits>
. Cela fonctionne?Qu'advient-il si vous modifiez cette ligne pour dire
return center_helper<std::string::value_type, std::string::traits_type>(str);
?Aussi, j'ai juste édité ma réponse à supprimer le modèle par défaut de l'argument sur la ligne 24. Ce n'est pas en train de faire quelque chose, je ne suis pas vraiment sûr pourquoi je l'ai eu il y a, en premier lieu, sans doute parce que j'étais en correspondance les arguments de modèle à la
center_helper
classe.OriginalL'auteur Lily Ballard
Il n'y a pas de
std::center
manipulateur. Je crains que vous avez à faire vous-même. Vous pourriez écrire une fonction d'aide à calculer les espaces compte tenu de la largeur et de la chaîne, afin de réduire les efforts.Voici un échantillon de ce qu'est une fonction d'assistance pourrait ressembler. Il a besoin de quelques travaux pour le rendre plus efficace, etc.
OriginalL'auteur Masked Man
Je crains que vous devrez le faire manuellement. Mais ce n'est pas que
dur si vous travaillez avec des chaînes. Quelque chose comme:
devrait faire l'affaire.
OriginalL'auteur James Kanze
vous pouvez utiliser la bibliothèque NCURSES... c'est un peu funk, et vous devez ajouter "-L NCURSES" à votre commande compile (g++ -L NCURSES yourProgram.cpp) et ça marchera plus vous pouvez faire des couleurs et des autres "cool" trucs [cool pour la CLI de toute façon].
il suffit de lire le manuel, le centrage des choses est assez facile.
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
OriginalL'auteur jEXEy