Qualcuno può spiegare in inglese semplice sulle differenze tra printf
, fprintf
e sprintf
con esempi?
In che flusso è?
Sono davvero confuso tra i tre di questi durante la lettura di "Gestione dei file in C".
Qualcuno può spiegare in inglese semplice sulle differenze tra printf
, fprintf
e sprintf
con esempi?
In che flusso è?
Sono davvero confuso tra i tre di questi durante la lettura di "Gestione dei file in C".
Risposte:
In C, un "flusso" è un'astrazione; dal punto di vista del programma è semplicemente un produttore (flusso di input) o consumatore (flusso di output) di byte. Può corrispondere a un file su disco, a una pipe, al terminale o ad altri dispositivi come una stampante o tty. Il FILE
tipo contiene informazioni sullo stream. Normalmente, non si scherza direttamente con FILE
il contenuto di un oggetto, si passa semplicemente un puntatore ad esso alle varie routine di I / O.
Esistono tre flussi standard: stdin
è un puntatore al flusso di input standard, stdout
è un puntatore al flusso di output standard ed stderr
è un puntatore al flusso di output degli errori standard. In una sessione interattiva, i tre di solito si riferiscono alla tua console, anche se puoi reindirizzarli per puntare ad altri file o dispositivi:
$ myprog < inputfile.dat > output.txt 2> errors.txt
In questo esempio, stdin
ora punta a inputfile.dat
,stdout
punta a output.txt
e stderr
punta a errors.txt
.
fprintf
scrive il testo formattato nel flusso di output specificato.
printf
equivale a scrivere fprintf(stdout, ...)
e scrive testo formattato ovunque il flusso di output standard stia attualmente puntando.
sprintf
scrive il testo formattato in una matrice di char
, anziché in un flusso.
printf ("format", args) è usato per stampare i dati sullo standard output che è spesso un monitor per computer.
sprintf (char *, "format", args) è come printf. Invece di visualizzare la stringa formattata sull'output standard, ad esempio un monitor, memorizza i dati formattati in una stringa puntata dal puntatore char (il primo parametro). La posizione della stringa è l'unica differenza tra la sintassi di printf e sprint.
fprintf (FILE * fp, "format", args) è di nuovo come printf. Qui, invece di visualizzare i dati sul monitor o salvarli in una stringa, i dati formattati vengono salvati su un file a cui punta il puntatore del file che viene utilizzato come primo parametro di fprintf. Il puntatore al file è l'unica aggiunta alla sintassi di printf.
Se il file stdout viene utilizzato come primo parametro in fprintf, il suo funzionamento viene considerato equivalente a quello di printf.
printf(...)
è equivalente a fprintf(stdout,...)
.
fprintf
viene utilizzato per l'output in streaming.
sprintf(buffer,...)
viene utilizzato per formattare una stringa in un buffer.
Nota che c'è anche vsprintf
, vfprintf
evprintf
v
sapori non sono standard credo
v
sapori sono sicuramente nello standard C.
Puoi anche fare cose molto utili con la funzione vsnprintf ():
$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>
struct exception_fmt : std::exception
{
exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
char const* what() const throw() { return msg_; }
char msg_[0x800];
};
exception_fmt::exception_fmt(char const* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(msg_, sizeof msg_, fmt, ap);
va_end(ap);
}
int main(int ac, char** av)
{
throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}
$ g++ -Wall -o test test.cc
$ ./test
terminate called after throwing an instance of 'exception_fmt'
what(): ./test: bad number of arguments 1
Aborted (core dumped)
vsnprintf
tratta di una funzione non standard. La maggior parte delle implementazioni che ho visto implementano questo o qualcosa del genere, ma è specifico per l'implementazione.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: scrive i dati formattati in una stringa di caratteri in memoria anziché in stdout
La sintassi di sprintf è:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Qui,
String si riferisce al puntatore a un buffer in memoria in cui devono essere scritti i dati.
Il formato si riferisce al puntatore a una stringa di caratteri che definisce il formato.
Ogni elemento è una variabile o un'espressione che specifica i dati da scrivere.
Il valore restituito da sprintf è maggiore o uguale a zero se l'operazione ha esito positivo o in altre parole viene restituito il numero di caratteri scritti, senza contare il carattere null che termina e restituisce un valore inferiore a zero in caso di errore.
printf: stampa su stdout
La sintassi per printf è:
printf format [argument]…
L'unica differenza tra sprintf () e printf () è che sprintf () scrive i dati in un array di caratteri, mentre printf () scrive i dati su stdout, il dispositivo di output standard.