Les différences entre les std :: endl et '\ n' pour les implémentations de streambuffer
-
27-10-2019 - |
Question
Je tente actuellement de mettre en œuvre une sous-classe de StringBuffer pour permettre le tampon de tokenize pour carbonise spécifiques ( « \ n » dans mon cas) et d'entreprendre une action si ce ombles se produit (vider le message à un enregistreur et un tampon clair après dans mon cas). Pour atteindre cet objectif, je sputc l'emportait sur (à mettre en œuvre pour le regarder « \ n ») et xsputn (à l'utilisation sputc En effet, comme la mise en œuvre du CCG ne semble pas le faire par défaut). Pour le débogage, je laisse sputc écrire chaque caractère qui lui est passé à stdout.
Maintenant, ma question est: Si j'utiliser quelque chose comme
mystream << "Some text" << std::endl;
sputc reçoit chaque caractère sauf du « \ n », qui devrait être intronisé par std :: endl, de sorte que l'action qui devrait ne se fait pas parce que le « \ n » est pas transmis. Si j'utilise quelque chose comme
mystream << "Some text" << '\n';
ou même
mystream << "Some text" << "\n" << std::flush;
tout fonctionne comme prévu et ma mise en œuvre sputc obtient le '\ n' omble chevalier.
Alors ma question est: Faut-il pas les deux lignes de code font exactement la même chose en ce qui concerne le derrière de StringBuffer, et sinon, que d'autres méthodes dois-je remplacer pour obtenir le « \ n »
?La solution
Vous ne pouvez pas passer outre sputc
parce sputc
n'est pas virtuel. Vous devez surcharge overflow
et sync
et d'examiner toute la séquence en attente pour les occurrences de \n
.
Vous ne devriez pas vraiment besoin d'une surcharge xsputn
à moins que vous pouvez faire quelque chose optimale parce que vous savez quelque chose de spécial à propos de l'appareil qui sauvegarde le type de flux.