2011-11-14 12 views
55

Sto cercando di imparare un po 'di più su come gli stream I/O funzionano in C++ e sono davvero confuso su quando usare cosa.Che cos'è esattamente streambuf? Come lo uso?

Che cos'è esattamente un streambuf?
Quando si utilizza uno streambuf, rispetto a uno string, uno istream o uno vector? (So ​​già gli ultimi tre, ma non come streambuf paragona a loro, se lo fa affatto.)

+0

È una brutta astrazione di un buffer di flusso. – Pubby

+1

@Pubby: Er, cos'è un "buffer di flusso"? In che cosa è diverso da un flusso o un buffer? – Mehrdad

+0

Da quello che ho capito, uno stream formatta l'input/output e lo memorizza nel suo buffer. – Pubby

risposta

38

buffer stream rappresentano dispositivi di ingresso o di uscita e fornire un'interfaccia di basso livello per l'I/O non formattato su quel dispositivo. Gli stream, d'altra parte, forniscono un wrapper di livello superiore attorno al buffer tramite funzioni di I/O non formattate di base e in particolare tramite funzioni I/O formattate (ad esempio, sovraccarichi operator<< e operator>>). Gli oggetti stream possono anche gestire la durata del buffer di un flusso.

Ad esempio un flusso di file ha un buffer di flusso di file interno. Lo stream gestisce la durata del buffer e il buffer fornisce le reali capacità di lettura e scrittura a un file. Gli operatori di formattazione del flusso accedono in ultima analisi alle funzioni di I/O non formattate del buffer del flusso, quindi è necessario utilizzare le funzioni I/O del flusso e non è necessario toccare direttamente le funzioni I/O del buffer.

Un altro modo per comprendere le differenze è osservare i diversi usi che fanno degli oggetti locali. Gli stream utilizzano le faccette che hanno a che fare con la formattazione come numpunct e num_get. È inoltre possibile aspettarsi che gli overload del flusso operator<< e operator>> per i tipi di dati di tempo o denaro personalizzati utilizzino le sfaccettature di formattazione del tempo e del denaro. I buffer di flusso, tuttavia, usano le faccette codecvt per convertire tra le unità i loro usi e byte dell'interfaccia. Pertanto, l'interfaccia per basic_streambuf<char16_t> utilizza char16_t e pertanto basic_streambuf<char16_t> utilizza internamente codecvt<char16_t, char, mbstate_t> per impostazione predefinita per convertire le unità formattate char16_t scritte nel buffer in char unità scritte nel dispositivo sottostante. Quindi puoi vedere che gli stream sono principalmente per la formattazione e i buffer di flusso forniscono un'interfaccia di basso livello per input o output non formattati ai dispositivi che potrebbero utilizzare una codifica esterna diversa.

È possibile utilizzare un buffer di flusso quando si desidera solo l'accesso non formattato a un dispositivo I/O. È inoltre possibile utilizzare i buffer di flusso se si desidera impostare più flussi che condividono un buffer di flusso (sebbene sia necessario gestire attentamente la durata del buffer). Esistono anche buffer di flusso per scopi speciali che potresti voler utilizzare, come ad esempio wbuffer_convert in C++ 11 che funge da facciata per un basic_streambuf<char> per renderlo simile a un buffer di flusso di caratteri ampi. Usa il facet codecvt con cui è costruito invece di usare il facet codecvt collegato a qualsiasi locale. Di solito è possibile ottenere lo stesso effetto semplicemente usando un ampio buffer di flusso intriso di un locale che presenta il facet appropriato.

+3

Questo è 5 anni troppo tardi, quindi non ho intenzione di postarlo come risposta e di non accettare questo, ma per qualcuno ancora confuso dalla terminologia anche dopo aver letto questo: 'streambuf' è per ** raw ** dati (es. byte grezzi, interi grezzi, ecc.), mentre 'stream' è per ** dati ** cucinati (testo, interi formattati come testo, ecc.). In altre parole, 'stream' rappresenta il livello ** parsing ** (o serializzazione). Quando si ha a che fare con stringhe semplici, si può usare tecnicamente, ma il significato è diverso: 'streambuf' significa che i dati grezzi devono essere la stringa stessa, mentre' stream' astrae la codifica. – Mehrdad

46

Con l'aiuto di streambuf, siamo in grado di lavorare in modo ancora livello inferiore. Permette l'accesso ai buffer sottostanti.

Ecco alcuni esempi: Copy, load, redirect and tee using C++ streambufs e in riferimento a confronto, Questo potrebbe essere utile,

enter image description here

Vedere questo per ulteriori dettagli: IOstream Library

+3

+1 per indicare un ottimo articolo. – jweyrich

+1

Ho cercato dappertutto qualcosa che potesse spiegare lo streambuf così come questo articolo. Grazie per avermi aiutato a trovarlo! – wvdschel

Problemi correlati