print2fp(const void *buffer, size_t size, FILE *stream) {
if(fwrite(buffer, 1, size, stream) != size)
return -1;
return 0;
}
Come scrivere i dati nello stream di stringhe anziché in File stream?String Streaming in C
print2fp(const void *buffer, size_t size, FILE *stream) {
if(fwrite(buffer, 1, size, stream) != size)
return -1;
return 0;
}
Come scrivere i dati nello stream di stringhe anziché in File stream?String Streaming in C
semplicemente utilizzare sprintf http://www.cplusplus.com/reference/cstdio/sprintf/
esempio dal riferimento:
#include <stdio.h>
int main()
{
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
uscita:
[5 + 3 è 8] è una stringa lunga 13 caratteri
Aggiornamento: Sulla base di raccomandazioni in commenti: Utilizzare snprinft in quanto è più sicuro (previene gli attacchi di buffer overflow) ed è portatile.
#include <stdio.h>
int main()
{
int sizeOfBuffer = 50;
char buffer [sizeOfBuffer];
int n, a=5, b=3;
n= snprintf (buffer, sizeOfBuffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a string %d chars long\n",buffer,n);
return 0;
}
noti che snprintf secondo argomento è in realtà la dimensione massima consentita da usare, in modo da poter mettere su un valore inferiore a quello sizeOfBuffer, tuttavia per il vostro caso non sarebbe necessario. Snprintf scrive solo SizeOfBuffer -1 caratteri e utilizza l'ultimo byte per il carattere di terminazione.
E proprio incazzare tutti, dal dipartimento di embbed e la sicurezza, ecco un link per http://www.cplusplus.com/reference/cstdio/snprintf/
Non utilizzare sprintf(), praticamente qualsiasi utilizzo di sprintf() esploderà a volte. Usa asprintf(), invece, malloc un buffer della lunghezza richiesta per te. – cmaster
Oppure 'snprintf' nel codice portatile. Inoltre, si prega di non collegare a cplusplus.com, quel sito Web è pieno di errori. cppreference.com è migliore. –
Inoltre, sprintf e vsprintf hanno problemi di sicurezza. http://www.codecogs.com/library/computing/c/stdio.h/printf.php?alias=snprintf ** "** Le funzioni sprintf e vsprintf sono facilmente abusate in un modo che consente agli utenti malintenzionati di arbitrariamente cambiare la funzionalità di un programma in esecuzione attraverso un attacco di overflow del buffer Poiché sprintf e vsprintf assumono una stringa infinitamente lunga, i chiamanti devono fare attenzione a non traboccare lo spazio reale, spesso difficile da garantire.Per sicurezza, i programmatori dovrebbero utilizzare invece l'interfaccia snprintf. ** "** – mike
C'è una funzione molto ordinato nello standard POSIX 2008: open_memstream(). Si utilizza in questo modo:
char* buffer = NULL;
size_t bufferSize = 0;
FILE* myStream = open_memstream(&buffer, &bufferSize);
fprintf(myStream, "You can output anything to myStream, just as you can with stdout.\n");
myComplexPrintFunction(myStream); //Append something of completely unknown size.
fclose(myStream); //This will set buffer and bufferSize.
printf("I can do anything with the resulting string now. It is: \"%s\"\n", buffer);
free(buffer);
Esiste una buona alternativa a 'open_memstream'? Un certo numero di piattaforme (tra cui Solaris) non forniscono questo [ancora]. –
@BrianVandenberg Il più vicino sarebbe 'asprintf()', che non è fornito da tutte le piattaforme. Tutte le altre alternative hanno gravi problemi di sicurezza perché possono sovraccaricare il buffer fornito ('sprintf()' e 'fmemopen()'), o forzare l'esecuzione della generazione della stringa due volte per evitare errori quando il buffer preallocato è troppo piccolo (' snprintf() '). Solo 'asprintf()' e 'open_memstream()' forniscono una semantica sicura a passaggio singolo. Tuttavia, se 'asprintf()' potrebbe funzionare per te, puoi facilmente implementare la tua versione tramite due passaggi di 'vsprintf()'. – cmaster
Grazie per la risposta. Sto facendo il porting di una libreria che non sono un manutentore per Solaris che usa 'open_memstream' una buona dose e speravo di trovare un modo per fornire una versione personalizzata per evitare di cambiare il loro codice. Potrei dover usare l'interposizione della libreria con un 'write()/close()' personalizzato (chiamando ovviamente le versioni di libc). –
Simile alla mia precedente domanda: http://stackoverflow.com/questions/1741191/creating-a-file-stream-that-results-in-a-string – Edmund
Dal momento che non hanno le funzioni degli stream di stringhe di POSIX 2008, probabilmente siete sfortunati - a meno che non possiate trovare una libreria che le simuli abbastanza bene per i vostri scopi. –
** Flussi di stringhe **
http://www.gnu.org/s/libc/manual/html_node/String-Streams.html –