Ho fatto ricerche per creare il mio ostream e insieme uno streambuf per gestire il buffer per il mio ostream. In realtà ho quasi tutto funzionante, posso inserire (< <) nel mio stream e ottenere stringhe senza problemi. Lo faccio implorando la funzione virtuale xsputn. Tuttavia se inserisco (< <) un float o un int allo stream invece di una stringa xsputn non viene mai chiamato.ereditando il problema ostream e streambuf con xsputn e overflow
Ho attraversato il codice e vedo che lo stream chiama do_put, quindi f_put che alla fine prova a mettere il carattere float 1 alla volta nel buffer. Posso richiamare la mia implementazione dell'overflow della funzione virtuale (int c) se lascio il mio buffer senza spazio e quindi ottengo i dati per il float e l'int.
Ora questo è il problema, ho bisogno di sapere quando il float è finito messo nel buffer. O per dirla in un altro modo, ho bisogno di sapere quando questa è l'ultima volta che verrà chiamato un overflow per un determinato valore in streaming. Il motivo per cui xsputn funziona per me è perché ottengo l'intero valore in anticipo e la sua lunghezza. Quindi posso copiarlo nel buffer quindi richiamare la funzione in attesa che il buffer sia pieno.
Sto abusando del disegno ostream in quanto devo memorizzare nella cache l'output e quindi inviarlo tutto in una volta per ogni valore immesso (< <).
In ogni caso per essere chiari, ripeterò quello che sto girando in un altro modo. C'è una buona possibilità che io stia solo andando nel modo sbagliato.
Desidero utilizzare un ostream e streambuf ereditato in modo da poter immettere valori in esso e consentirgli di gestire la conversione del tipo per me, quindi voglio trasferire tali informazioni a un altro oggetto che sto passando a un handle in basso lo streambuf a (per?). Quell'oggetto ha un costoso I/O, quindi non desidero inviare i dati 1 carattere alla volta.
Ci scusiamo in anticipo se questo non è chiaro. E grazie per il tuo tempo.
che è fondamentalmente ciò che sto facendo ora, quello che voglio sapere è se v'è comunque per dirvi quante volte troppo pieno sta per essere chiamato, o quando l'ultimo il char sta arrivando. Ad esempio, se eseguo mystream << 1.3f; Otterrò i caratteri '1' quindi '.' poi '3' ma dentro lo streabuf non ho modo di sapere quanti personaggi aspettarsi. E dopo aver ottenuto il 3 voglio agire sul buffer (richiamo su un altro oggetto facendogli sapere che è pronto) –
Non c'è modo in cui il codice possa sapere in anticipo che cosa farà il codice client, o quante volte esso sta per essere chiamato. Quello che puoi fare è impostare 'unitbuf' su' ostream': questo farà sì che 'sync' sia chiamato alla fine di ogni' operatore << '(nel distruttore dell'oggetto' sentry'). Quindi agisci sul buffer in 'sync'. –
aha! questo è ESATTAMENTE quello di cui avevo bisogno! Segnando questa come risposta, non posso ancora votare, tornerò e lo farò una volta che avrò abbastanza rep. Grazie mille. –