Ho una funzione che funziona con uno std::ostream
. Ho bisogno di sostenere con un handle di file C (FILE*
). Devo creare la mia sottoclasse di std::ostream
che delega a un numero FILE*
?Wrapping FILE * con std personalizzato :: ostream
risposta
Come sottolinea Ben Voigt, si desidera creare una sottoclasse di streambuf
. Ci sono pagine sul sito web dell'Università di Southern California che hanno la documentation, header e source per un'implementazione GNU di un streambuf
sottoclasse (stdiobuf
) che avvolge un FILE*
. Ha alcune dipendenze sulla libreria si tratta di una parte di (GroovX), ma quelli dovrebbe essere facilmente rimuovere (vorrei cominciare eliminando tutti i riferimenti a GVX_TRACE
).
È interessante notare che fornisce anche una sottoclasse minimalista (stdiostream
) di std::iostream
, nonostante quanto affermato da Ben Voigt. Ma questo non sembra essere necessario, poiché il metodo ("buffer di lettura"/imposta il buffer del flusso) che la classe stdiostream
utilizza per collegare la classe stdiobuf
a un oggetto flusso è pubblicamente accessibile.
È possibile trovare ulteriori informazioni sulla sottoclasse streambuf
here (guardare in particolare nella parte inferiore della pagina, che illustra le funzioni virtuali). L'implementazione collegata sopra sostituisce sync
, underflow
(per supportare l'input) e overflow
(per supportare l'output).
Ulteriori avvertenze circa l'attuazione collegato:
- Procedimento
init
utilizza ilsetg
esetp
metodi per impostare i puntatori per le sequenze di ingresso e di uscita. - La riga
const int num = pptr()-pbase();
sta calcolando il numero di caratteri da svuotare sottraendo base output pointer da current output pointer ("puntatore put"). - La variabile inutilmente chiamato
om
è il parametro modalità. - la variabile denominata
fd
è il descrittore di file.
No, ostream
non deve essere derivato da. Il modo in cui la libreria iostreams permette personalizzazione è fornendo un puntatore streambuf
quando si crea un ostream
. streambuf
ha un sacco di funzioni virtuali in modo da poter cambiare il suo comportamento.
È necessario derivare direttamente da streambuf
o dalla sottoclasse esistente filebuf
. Probabilmente hai solo bisogno di fornire la funzione overflow
, i valori di default per tutti gli altri dovrebbero funzionare bene.
Wow, in realtà suona a metà pulito. –
Bene, iostreams è progettato per essere estensibile. Circa una settimana fa, ho scritto uno 'stingbuf' per permettere che i dati scritti su' cout' comparissero in una casella di testo dell'interfaccia utente quando non vi era alcuna finestra della console collegata (semplicemente sincronizzare 'sync'), e anche una sottoclasse' streambuf' di input usando file mappati in memoria e che era in un raggio di 20-30 volte più veloce di 'ifstream' +' getline' + 'istringstream' ero stato usato per l'elaborazione del file di testo. È davvero sorprendente quanto siano inefficienti le implementazioni standard di streambuf, perché cercano di adattarsi a ogni possibile scenario. –
In realtà, è perfettamente corretto derivare da 'ostream', si veda ad esempio' ofstream'. Tuttavia, tali classi derivate forniscono solo un convenzionence ctor che chiama 'ostream :: ostream (streambuf *)'. – MSalters
- 1. Un ostream personalizzato
- 2. Implementazione di un no-op std :: ostream
- 3. Come ereditare da std :: ostream?
- 4. Come salvare `std :: vector <uchar>` in `std :: ostream`?
- 5. std :: funziona come un manipolatore di flusso personalizzato
- 6. Impossibile confrontare std :: unorded_set con KeyEqual personalizzato
- 7. Utilizzo deleter personalizzato con std :: shared_ptr
- 8. Una classe C++ si comporta come un ostream personalizzato, sstream
- 9. wrapping knockout.js con clojurescript
- 10. stringstream problema ritorno ostream temporanea
- 11. Come usare C++ std :: ostream con la formattazione simile a printf?
- 12. Allocatore personalizzato in std :: vector
- 13. Inseritore personalizzato per std :: copy
- 14. Utilizzare ostream con basi diverse da 8, 10 e 16
- 15. "ostream" errore non definito
- 16. Problemi wxPython con Wrapping StaticText
- 17. Qual è l'approccio migliore per il wrapping di un container STL in un iteratore personalizzato?
- 18. Wrapping richiede
- 19. Utilizzo di ostream come riferimento (C++)
- 20. std :: vector: non si può legare 'std :: ostream {alias std :: basic_ostream <char>}' lvalue a 'std :: basic_ostream <char> &&'
- 21. Come utilizzare un deleter personalizzato con un membro std :: unique_ptr?
- 22. Come implementare un allocatore personalizzato da utilizzare con std :: map?
- 23. binary_search con std :: coppia utilizzando un operatore personalizzato
- 24. std :: unique_ptr con deleter personalizzato per win32 LocalFree
- 25. type_traits guasto di segmentazione con std :: string
- 26. Qual è la differenza tra printf e std :: ostream sotto consolle finestre usando UTF-8 uscita
- 27. Errore linker STD con Apple LLVM 4.1
- 28. reindirizza std :: cout a un writer personalizzato
- 29. Utilizzando std :: set personalizzato di confronto
- 30. Domanda sull'operatore ostream <<
Se vuoi diventare pazzo e cambiarlo, vai avanti. Niente sul wrapping delle cose con le classi, o FILE * ereditato e standardizzato separatamente da C lo rende una domanda di tipo C. Come Stackoverflow-it ama sottolineare, C non è un sottoinsieme di C++. –
Vedere [this] (http://ilab.usc.edu/rjpeters/groovx/classrutz_1_1stdiobuf.html) sottoclasse di 'streambuf' che include' FILE * '. –
@Kazark: Impressionante ... Se lo pubblichi come risposta, lo accetterei :) – Akusete