Domanda

Attualmente sto cercando di implementare una sottoclasse di stringbuf per consentire al buffer di tokenizzare caratteri specifici ('\ n' nel mio caso) e intraprendere un'azione se si verifica questo carattere (eseguire il dump del messaggio su un logger e cancellare il buffer in seguito nel mio caso). Per raggiungere questo obiettivo, ho sovrascritto sputc (per implementare guardando fuori per '\ n') e xsputn (per usare sputc in effetti, poiché l'implementazione di GCC non sembra farlo per impostazione predefinita). Per scopi di debug, ho lasciato che sputc scriva ogni carattere che gli viene passato allo stdout.

Questa è la mia domanda: se uso qualcosa di simile

mystream << "Some text" << std::endl;

sputc riceve ogni carattere eccetto "\ n" che dovrebbe essere indotto da std :: endl, quindi l'azione prevista non viene eseguita perché "\ n" non viene trasmessa. Se uso qualcosa come

mystream << "Some text" << '\n';

o anche

mystream << "Some text" << "\n" << std::flush;

tutto funziona come previsto e la mia implementazione sputc riceve il carattere "\ n".

Quindi la mia domanda è: entrambe le righe di codice non dovrebbero fare esattamente lo stesso per quanto riguarda lo stringbuf dietro, e in caso contrario, quali altri metodi devo sovrascrivere per ottenere il '\ n'?

È stato utile?

Soluzione

Non è possibile sovrascrivere sputc perché sputc non è virtuale.Devi sovraccaricare overflow e sync ed esaminare l'intera sequenza in sospeso per le occorrenze di \n.

Non dovresti davvero aver bisogno di sovraccaricare xsputn a meno che tu non possa fare qualcosa di ottimale perché conosci qualcosa di speciale sul dispositivo che supporta il tuo tipo di streaming.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top