Différence entre std :: endl et (concernant la sensibilisation à la plate-forme)

StackOverflow https://stackoverflow.com//questions/9699280

  •  13-12-2019
  •  | 
  •  

Question

Avant de déclarer cette question comme un double de ce ou que, veuillez considérer que j'ai soumis un problème à le juge en ligne avec \n et j'ai eu WA, et puis avec std::endl et j'ai eu AC.J'ai donc besoin d'une réponse très précise sur le point de sensibilisation à la plateforme:Est \n vraiment conscient de la plate-forme, et le runtime écrit-il vraiment la fin de ligne correcte en fonction de la plate-forme, comme le prétendent les réponses aux autres questions ?Si oui, pourriez-vous me dire comment cela s'est produit ??

Si la réponse peut être étayée par une citation de la norme concernant le problème de sensibilisation à la plate-forme, je serais vraiment reconnaissant.J'ai lu toutes les réponses des autres questions (même celles fermées), alors s'il vous plaît, ne répétez pas la chose "vider le tampon".

Était-ce utile?

La solution

Depuis C++11, §27.7.3.8 -

namespace std
{
    template <class charT, class traits>
        basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}

Effets : Appelle os.put(os.widen(’ ’)), puis os.flush().

Renvoie : os.

Donc, d'après la norme, il est clair que endl vide le tampon du flux de sortie, tandis que \n n'a pas.En général, vous souhaiterez utiliser endl pour imprimer une nouvelle ligne, mais vous devez également garder à l'esprit qu'à chaque fois que vous faites cela, le tampon de sortie sera également vidé.

À propos de la notoriété de la plateforme

D'après la norme, il est évident que les deux font exactement la même chose : imprimer une nouvelle ligne exactement de la même manière.Ainsi, si l’un est indépendant de la plate-forme, l’autre devrait également être le même.Puisque je sais avec certitude endl est indépendant de la plate-forme, il devrait en être de même pour \n.

Autres conseils

std::endl est un manipulateur qui produit '\n', puis vide le flux.Pour une utilisation la plus occasionnelle, c’est ce que vous devriez utiliser.Cependant, lors de la sortie de gros volumes de données, cela peut entraîner une baisse significative des performances, auquel cas, utilisez '\n'.

MODIFIER:

En ce qui concerne la notoriété de la plateforme :les deux produisent exactement la même chose.Si le flux a été ouvert en mode texte, le '\n' entraînera l'apparition d'une représentation dépendante de la plate-forme d'une fin de ligne :0x0A sous Unix, 0x0D, 0x0A sous Windows, démarrer un nouvel enregistrement sous certains mainframes, etc.Si le flux a été ouvert en mode binaire, un seul octet (généralement 0x0A, mais cela dépend en fait du codage de caractères de base utilisé) sera généré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top