Sto cercando un modo per passare in un FILE *
a qualche funzione in modo che la funzione possa scrivere su di esso con fprintf
. Questo è facile se voglio che l'output venga visualizzato in un file reale su disco, ad esempio. Ma quello che mi piacerebbe invece è ottenere tutto l'output come una stringa (char *
). Il tipo di API che vorrei è:Creazione di un flusso FILE * che risulta in una stringa
/** Create a FILE object that will direct writes into an in-memory buffer. */
FILE *open_string_buffer(void);
/** Get the combined string contents of a FILE created with open_string_buffer
(result will be allocated using malloc). */
char *get_string_buffer(FILE *buf);
/* Sample usage. */
FILE *buf;
buf = open_string_buffer();
do_some_stuff(buf); /* do_some_stuff will use fprintf to write to buf */
char *str = get_string_buffer(buf);
fclose(buf);
free(str);
Il glibc intestazioni sembrano indicare che un file può essere impostato con le funzioni di gancio per eseguire la lettura e la scrittura vera e propria. Nel mio caso, penso che voglio che il gancio di scrittura aggiunga una copia della stringa a un elenco collegato e che ci sia una funzione get_string_buffer
che calcoli la lunghezza totale dell'elenco, allochi la memoria per esso e quindi copi ogni elemento in esso nel posto giusto.
Sto puntando a qualcosa che può essere passato a una funzione come do_some_stuff
senza che la funzione debba sapere altro che ha un FILE *
a cui è possibile scrivere.
Esiste un'implementazione esistente di qualcosa di simile? Sembra una cosa utile e C-friendly da fare, supponendo che abbia ragione sull'estensibilità FILE
.
open_memstream è esattamente quello che voglio. Non sono sicuro che stia usando l'approccio della lista collegata, ma non scriverò grandi somme su di esso, quindi non importa. – Edmund