2015-04-24 6 views
6

Durante la lettura attraverso la documentazione GNU su string streams ho trovato due funzioni simili che fanno cose molto simili:Qual è la differenza tra fmemopen e open_memstream?

FILE * fmemopen (void *buf, size_t size, const char *opentype) 
FILE * open_memstream (char **ptr, size_t *sizeloc) 

Dalla lettura della documentazione, sembra open_memstream deve essere utilizzato per l'apertura di un flusso di output e fmemopen per l'ingresso. Quello che mi sorprende è l'argomento opentype che puoi passare a fmemopen.

Il Linux manpage explains:

Se buf è specificato come NULL, fmemopen() alloca dinamicamente una dimensione di buffer byte. Ciò è utile per un'applicazione che richiede per scrivere dati su un buffer temporaneo e quindi leggerlo di nuovo. Il buffer viene liberato automaticamente quando lo streaming viene chiuso. Notare che il chiamante non ha modo di ottenere un puntatore al buffer temporaneo assegnato da questa chiamata (ma vedere open_memstream() di seguito).

Quindi quale sarebbe il punto di usare open_memstream se fmemopen in grado di gestire l'apertura di un flusso di input/output?

risposta

10

Con fmemopen, il buffer viene allocato o prima dell'apertura e non cambia dimensione in un secondo momento. Se hai intenzione di scrivere su di esso, devi sapere quanto sarà grande il tuo output prima di iniziare. Con open_memstream il buffer cresce man mano che si scrive.

+0

Ah, capisco. Buona intuizione, la pagina man di fmemopen non ha detto esplicitamente, ma ora vedo che è implicita. –

2

Il FILE* per open_memstream è sola scrittura

POSIX http://pubs.opengroup.org/onlinepubs/9699919799/functions/open_memstream.html

Queste funzioni sono simili a fmemopen() eccetto che la memoria viene sempre allocata dinamicamente dalla funzione, e la corrente è aperto solo per l'output.

Quindi c'è una seconda differenza oltre all'allocazione dinamica: il file è aperto solo per la scrittura. (E dal momento che non è possibile cambiare le bandiere di corsi d'acqua aperti, non si dovrebbe essere in grado di leggere dal flusso.)

Tuttavia sembra alcune implementazioni potrebbero permettere questo: Can I read stream produced by open_memstream()?

Problemi correlati