De nombreux livres C ++ contiennent des exemples de code comme celui-ci ...
std::cout << "Test line" << std::endl;
... donc je l'ai toujours fait aussi. Mais j'ai vu à la place beaucoup de code de développeurs qui travaillent comme ceci:
std::cout << "Test line\n";
Y a-t-il une raison technique de préférer l'un à l'autre, ou s'agit-il simplement d'une question de style de codage?
c++
coding-style
iostream
c++-faq
Geek en chef
la source
la source
'\n'
.Réponses:
Les différents caractères de fin de ligne n'ont pas d'importance, en supposant que le fichier est ouvert en mode texte, ce que vous obtenez à moins que vous ne demandiez le binaire. Le programme compilé écrira la bonne chose pour le système compilé.
La seule différence est qu'il
std::endl
vide le tampon de sortie, et'\n'
ne le fait pas. Si vous ne voulez pas que le tampon soit vidé fréquemment, utilisez'\n'
. Si vous le faites (par exemple, si vous voulez obtenir toute la sortie et que le programme est instable), utilisezstd::endl
.la source
::std::cerr
au lieu de::std::cout
car il est sans tampon et vidé avec chaque opération de sortie.stderr
c'est pour les "erreurs". C'est plutôt pour les messages de diagnostic hors bande, si vous voulez. Il devrait être possible de dire./prog > file
et de stocker uniquement la véritable charge utile du programme, mais le programme peut souhaiter afficher beaucoup plus d'informations sur l'état, même en interaction normale.La différence peut être illustrée par ce qui suit:
est équivalent à
Donc,
std::endl
Si vous souhaitez forcer un vidage immédiat sur la sortie.\n
si vous vous inquiétez des performances (ce qui n'est probablement pas le cas si vous utilisez l'<<
opérateur).J'utilise
\n
sur la plupart des lignes.Utilisez ensuite
std::endl
à la fin d'un paragraphe (mais c'est juste une habitude et généralement pas nécessaire).Contrairement à d'autres affirmations, le
\n
caractère n'est mappé sur la séquence de fin de ligne de plate-forme correcte que si le flux va vers un fichier (std::cin
et qu'ilstd::cout
est spécial mais toujours des fichiers (ou de type fichier)).la source
cout
est lié àcin
, ce qui signifie que si vous lisez une entréecin
,cout
il sera vidé en premier. Mais si vous souhaitez afficher une barre de progression ou quelque chose sans lirecin
, alors, le rinçage est utile.operator<<
n'était pas performant, ou quelle alternative utiliser pour la performance? Veuillez m'indiquer du matériel pour mieux comprendre cela.sync_with_stdio(false)
et de ne pas vider votre sortie en continu. Laissez la bibliothèque déterminer quand le faire. stackoverflow.com/a/1926432/14065sync_with_stdio
rend les iostreams aussi rapides que stdio. Ce n'est pas le casIl peut y avoir des problèmes de performances,
std::endl
force un vidage du flux de sortie.la source
Il y a un autre appel de fonction implicite là-dedans si vous allez utiliser
std::endl
a) appelle
<<
une fois l' opérateur .b) appelle
<<
deux fois l' opérateur .la source
std::cout << "Hello" << "\n";
?<<
seraient également 2 dans le cas a , donc je ne dirais pas que le besoin d'un ou deux<<
(ou deux appels de fonction en général) soit un différence entre\n
etendl
.Je me souviens avoir lu à ce sujet dans la norme, alors voici:
Voir la norme C11 qui définit comment les flux standard se comportent, car les programmes C ++ interfacent avec le CRT, la norme C11 devrait régir la politique de vidage ici.
Cela signifie que
std::cout
etstd::cin
sont entièrement tamponnés si et seulement si font référence à un appareil non interactif. En d'autres termes, si stdout est attaché à un terminal, il n'y a pas de différence de comportement.Cependant, si
std::cout.sync_with_stdio(false)
est appelé,'\n'
cela ne provoquera pas de vidage, même sur les appareils interactifs. Sinon,'\n'
c'est équivalent àstd::endl
moins de canaliser vers des fichiers: ref c ++ sur std :: endl .la source
Ils écriront tous les deux le ou les caractères de fin de ligne appropriés. En plus de cette fin, le tampon sera validé. Vous ne souhaitez généralement pas utiliser endl lors des E / S sur les fichiers car les validations inutiles peuvent avoir un impact sur les performances.
la source
Ce n'est pas grave, mais endl ne fonctionnera pas dans boost :: lambda .
la source
Si vous utilisez Qt et
endl
, vous pourriez accidentellement finir par utiliser une erreurendl
qui vous donnera des résultats très surprenants. Voir l'extrait de code suivant:Notez que j'ai écrit à la
endl
place destd::endl
(ce qui aurait été correct) et apparemment il y a uneendl
fonction définie dans qtextstream.h (qui fait partie de QtCore).L'utilisation
"\n"
au lieu deendl
contourner complètement tous les problèmes d'espace de noms potentiels. C'est aussi un bon exemple pour lequel placer des symboles dans l'espace de noms global (comme Qt le fait par défaut) est une mauvaise idée.la source
using namespace std;
?? :-)using namespace std;
. C'est considéré comme une mauvaise pratique. Voir Pourquoi utilise «namespace std;» considéré comme une mauvaise pratique?J'ai toujours eu l'habitude d'utiliser simplement std :: endl parce que c'est facile à voir pour moi.
la source
Le
std::endl
manipulateur est équivalent à'\n'
. Maisstd::endl
vide toujours le flux.la source
Si vous avez l'intention d'exécuter votre programme sur autre chose que votre propre ordinateur portable, n'utilisez jamais l'
endl
instruction. Surtout si vous écrivez beaucoup de lignes courtes ou comme j'ai souvent vu des caractères uniques dans un fichier. L'utilisation deendl
is know pour tuer les systèmes de fichiers en réseau comme NFS.la source
Avec référence Il s'agit d'un manipulateur d'E / S uniquement en sortie .
std::endl
Insère un caractère de nouvelle ligne dans le SE de la séquence de sortie et le vide comme si en appelantos.put(os.widen('\n'))
suivi deos.flush()
.Quand utiliser:
Ce manipulateur peut être utilisé pour produire une ligne de sortie immédiatement ,
par exemple
Aussi
la source