Diferencias entre std :: endl y '\ n' para implementaciones de streambuffer
-
27-10-2019 - |
Pregunta
Actualmente estoy tratando de implementar una subclase de stringbuf para permitir que el búfer se convierta en token para caracteres específicos ('\ n' en mi caso) y emprender una acción si se produce este carácter (volcar el mensaje a un registrador y borrar el búfer luego en mi caso). Para lograr este objetivo, anulé sputc (para implementar vigilando el '\ n') y xsputn (para usar sputc de hecho, ya que la implementación de GCC no parece hacer esto de forma predeterminada). Para fines de depuración, dejo que sputc escriba cada carácter que se le pasa a stdout.
Esta es mi pregunta: si utilizo algo como
mystream << "Some text" << std::endl;
sputc recibe cada carácter excepto el '\ n' que debería ser inducido por std :: endl, por lo que la acción que se espera no se realiza porque el '\ n' no se transmite. Si uso algo como
mystream << "Some text" << '\n';
o incluso
mystream << "Some text" << "\n" << std::flush;
todo funciona como se esperaba y mi implementación sputc obtiene el carácter '\ n'.
Entonces mi pregunta es: ¿No deberían ambas líneas de código hacer exactamente lo mismo con respecto al stringbuf detrás, y si no, qué otros métodos tengo que anular para obtener el '\ n'?
Solución
No puede anular sputc
porque sputc
no es virtual.Necesita sobrecargar overflow
y sync
y examinar toda la secuencia pendiente en busca de apariciones de \n
.
No debería necesitar sobrecargar xsputn
a menos que pueda hacer algo óptimo porque sabe algo especial sobre el dispositivo que respalda su tipo de transmisión.