En C++, comment imprimer ASCII art à la console?
Disons que vous voulez imprimer un de ces grands ASCII art des images. Comment pouvez-vous le faire sans cout
chaque ligne individuellement?
Depuis C++11, vous pouvez utiliser le raw un littéral de chaîne. en.cppreference.com/w/cpp/language/string_literal stackoverflow.com/a/34737663/1749675 pour un exemple.
OriginalL'auteur Mark | 2010-02-02
Vous devez vous connecter pour publier un commentaire.
Adjacentes littéraux de chaîne sont concaténés, de sorte que vous pouvez le faire:
Ou, plus exactement, peut-être:
Avec plus de discernement, l'utilisation
endl
. C'est subtilement différent de juste "\n" à la fin de chaque ligne, parce que vous aurez également vider le flux de sortie.Ces exemples ne fonctionnent pas comme ils sont remplis avec des séquences d'échappement. Partout où vous voyez un "\" est le début d'une séquence d'échappement et ne sera pas affiché sur la console. Compiler et vous obtiendrez des mises en garde à propos d'eux en fait. Je suis en train d'essayer de comprendre comment cela s'est repris comme la meilleure réponse encore.
Les exemples donnent
warning: unknown escape sequence: '\_'
jouer avec les polices de caractères ne pas ajouter quelque chose d'utile pour la réponse.OriginalL'auteur John Feminella
essayez quelque chose comme:
cout << R"(place multiple lines
of text here
and it will display exactly
as you have it between the two brackets,
line feeds and all.)";
...le code ci-dessus vous permettra également d'utiliser des caractères comme la barre oblique inverse \ sans avoir besoin de deux d'entre eux, il affiche tout et ne reconnaît pas les codes de contrôle, comme \n etc. Très pratique.
OriginalL'auteur Neil Roy
D'autres l'ont déjà suggéré l'utilisation d'
endl
. Si ce n'est pas (nécessairement) une mauvaise chose, à l'aide deendl
bouffées de la riveraine du cours d'eau ainsi que l'écriture d'une nouvelle ligne. Contraire à l'implication dans l'une des réponses que vous avez obtenu, à l'aide deendl
ne pas aider (à tous) avec la traduction de la nouvelle ligne de quelque nature que ce soit de la séquence de la plate-forme utilise normalement pour signaler la fin d'une ligne. À l'aide denewline
est garanti d'être précisément équivalent àstream << "\n" << flush;"
. La traduction de nouvelles lignes "\r", ou "\n" ou "\r\n", ou quelle que soit la plate-forme préfère, se fait à un niveau différent etnewline
n'a rien à faire avec elle.La
flush
qu'il n'a, cependant, peuvent (et souvent) ralentir votre I/O, parfois, par une marge considérable. Aussi longtemps que vous êtes seulement écrit quelques lignes (ex: les quelques centaines de caractères), il est probablement totalement hors de propos. Si vous êtes à l'écriture d'un fichier de grande taille, cependant, l'utilisation deendl
au lieu de"\n"
peut facilement entraîner dans un 10x ralentissement (en fait, j'irais même jusqu'à dire que beaucoup de l'idée que iostreams sont lents découle directement de l'aideendl
).Qui ne veut pas dire qu'il n'y a jamais aucune raison pour l'utiliser endl. Le
flush
assure que tout ce qui a été écrit dans le flux de données est immédiatement évacuée de la bibliothèque standard du tampon, et envoyé à l'OS. Si vous souhaitez assurer un affichage immédiat,endl
peut être utile. De même, si vous êtes en train de faire la journalisation, et il est essentiel que votre journal de toujours refléter les plus récentes connues de l'état d'un programme,endl
peut être (très) utile pour s'assurer que ce que vous avez écrit est vraiment connecté, pas perdu dans une mémoire tampon lorsque vous/si l'application se bloque.Donc,
endl
fait sens à la fois, mais probablement 95% du temps qu'il est utilisé, c'est vraiment inapproprié (par exemple, il est peu probable pour accomplir quelque chose d'utile dans l'une des réponses à cette question).OriginalL'auteur Jerry Coffin
C'est assez simple, heureusement. Utilisez simplement endl chaque fois que vous voulez démarrer une autre ligne.
Je tiens à dire que je préfère de beaucoup l'aide endl car il doit fonctionner même si vous êtes sur une plate-forme qui exige "\r\n" au lieu de "\n".
Oui, il peut devenir un fardeau fait de cette façon, mais si tout ce qu'il est en train de faire de l'impression d'un peu d'ascii art, il ne devrait pas être un problème. L'autre moyen serait de faire le travail d'emballage, le tout dans une grande chaîne et bousculer tout cela à la fois. J'ai eu à faire qu'à l'occasion, mais la plupart du temps, cette méthode n'est pas un problème.
Votre remarque sur
std::endl
est stupide. Même si vous êtes sur une plate-forme qui nécessite\r\n
au lieu de\n
comme sa native terminateur de ligne,\n
est encore le saut de ligne terminator en C et C++, et les bibliothèques d'e/S de le convertir pour vous. (C'est la différence entre le mode texte et binaire en mode flux.)std::endl
est un peu moins efficace que les premières\n
depuis inutilement vide le flux.Vous avez probablement raison, mais je n'ai avoir des problèmes avec elle il y a plusieurs années. À côté de rien d'être utilisé de nos jours a des problèmes avec seulement l'aide de '\n'.
Lisez la question à nouveau. Il a spécifiquement demandé comment le faire sans couting chaque ligne.
OriginalL'auteur Player1st