2011-01-07 14 views
140

Kann jemand in einfachem Englisch über die Unterschiede zwischen printf, fprintf und sprintf mit Beispielen erklären?Unterschied zwischen fprintf, printf und sprintf?

In welchem ​​Strom ist es?

Ich bin wirklich verwirrt zwischen den drei von diesen beim Lesen über "File Handling in C".

+4

Experimentieren Sie mit ihnen, indem Sie einen Beispielcode schreiben. Das ist ein sehr einfacher Weg, den Unterschied zwischen ihnen klar zu verstehen. – Nawaz

+13

Ziehen Sie snprintf() zu sprintf(), um unnötige Pufferüberläufe zu vermeiden. –

+3

Bevorzugen Sie Streams oder Boost-Formatierern, um alberne Pufferüberläufe und bösartige Unsicherheiten zu vermeiden. –

Antwort

169

In C, ein "Strom" ist eine Abstraktion; Aus der Perspektive des Programms ist es einfach ein Erzeuger (Eingabestrom) oder ein Verbraucher (Ausgabestrom) von Bytes. Sie kann einer Datei auf der Festplatte, einer Pipe, Ihrem Terminal oder einem anderen Gerät wie einem Drucker oder einem Terminal entsprechen. Der Typ FILE enthält Informationen zum Stream. Normalerweise verwirren Sie den Inhalt eines Objekts nicht direkt mit FILE, sondern geben Sie einfach einen Zeiger auf die verschiedenen I/O-Routinen.

Es gibt drei Standardströme: stdin ist ein Zeiger auf den Standard-Eingabestrom, stdout ist ein Zeiger auf den Standardausgabestrom und stderr ist ein Zeiger auf den Standard-Fehlerausgabestrom. In einer interaktiven Sitzung, in der Regel die drei auf der Konsole beziehen, obwohl man sie auf andere Dateien oder Geräte Punkt umleiten:

$ myprog <inputfile.dat> output.txt 2> errors.txt 

In diesem Beispiel weist stdin nun auf inputfile.dat, stdout Punkte zu output.txt und stderr zeigt auf .

fprintf schreibt formatierten Text in den von Ihnen angegebenen Ausgabedatenstrom.

printf entspricht dem Schreiben fprintf(stdout, ...) und schreibt formatierten Text an den aktuellen Standard-Ausgabestrom.

sprintf schreibt formatierten Text in ein Array von char, im Gegensatz zu einem Stream.

+1

"Es ist einfach ein Produzent (Eingabestream) oder Consumer (Ausgabestrom) von Bytes." Sind diese rückwärts? Wäre ein Produzent nicht etwas (Output)? Fragen, weil ich wirklich nicht weiß. –

+3

@DaveVoyles: Dies sind aus der Perspektive Ihres Programms. Ein Eingabestream erzeugt Bytes, die Ihr Programm lesen kann. Ein Ausgabestream verbraucht die von Ihrem Programm erzeugten Bytes. –

+0

"Diese sind aus der Perspektive Ihres Programms." Das hat es geklärt, danke! –

19

printf(...) entspricht fprintf(stdout,...).

fprintf wird verwendet, um zu streamen.

sprintf(buffer,...) wird verwendet, um eine Zeichenfolge in einen Puffer zu formatieren.

Hinweis gibt es auch vsprintf, vfprintf und vprintf

+0

Die 'v' Aromen sind nicht-Standard ich glaube –

+8

Die' v' Aromen sind sehr sicher in der C-Norm. –

+0

@larsmans: ah, ok. danke für die Korrektur. Diese Frage wurde an einem Punkt markiert [C++] –

117

printf Ausgänge an den Standardausgabestrom (stdout)

fprintf zu einer Datei-Handle geht (FILE*)

sprintf zu einem Puffer geht man zugeordnet. (char*)

2

Sie können auch tun sehr nützliche Dinge mit vsnprintf() Funktion:

$ 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) 
+0

+1 in der Tat nützlich, aber sei dir bewusst, dass 'vsnprintf' eine Nicht-Standard-Funktion ist. Die meisten Implementierungen, die ich gesehen habe, implementieren dies oder etwas ähnliches, aber es ist implementierungsspezifisch. –

+1

@larsmans erwähnt darüber, dass dies in der Tat ein Teil des C-Standards ist, also nehme ich das zurück –

+2

Was hat das mit C zu tun? – onemasse

0

fprintf Dieses mit Strömen in Beziehung steht, wo als printf eine Anweisung ähnlich fprintf ist aber nicht beschränkt auf Ströme im Zusammenhang, das heißt fprintf ist verwandt Datei

0

sprintf: statt stdout Schreibt eine formatierte Daten in eine Zeichenfolge im Speicher

Syntax von sprintf ist:

#include <stdio.h> 
int sprintf (char *string, const char *format 
[,item [,item]…]); 

Hier

String verweist auf den Zeiger auf einen Puffer im Speicher, in den die Daten geschrieben werden sollen.

Format bezieht sich auf Zeiger auf eine Zeichenfolge, die das Format definiert.

Jedes Element ist eine Variable oder ein Ausdruck, der die zu schreibenden Daten angibt.

Der von sprintf zurückgegebene Wert ist größer oder gleich null, wenn die Operation erfolgreich ist, dh die Anzahl der geschriebenen Zeichen, das abschließende Nullzeichen nicht mitgezählt, wird zurückgegeben, wenn ein Fehler aufgetreten ist .

printf: Prints in stdout

Syntax für printf ist:

printf format [argument]… 

Der einzige Unterschied zwischen sprintf() und printf() besteht darin, dass sprintf() von Daten in ein Zeichenfeld schreibt, während printf() schreibt Daten in stdout, das Standard-Ausgabegerät.

2

printf

  1. printf wird verwendet, die Ausgabe auf dem Bildschirm durchzuführen.
  2. syntax = printf("control string ", argument);
  3. Es ist nicht mit Datei-Eingabe/Ausgabe-

fprintf

  1. Die fprintf es verwendet zugeordnet ist Schreiboperation in die Datei zu behandeln durch FILE wies auszuführen.
  2. Die Syntax ist fprintf (filename, "control string ", argument);
  3. es mit Datei-Eingabe/Ausgabe-
+0

Wenn dies von irgendwo anders zitiert wird, ist es am besten, die Quelle mit einem Link anzugeben, aber behalten Sie den Text, den Sie hier zitiert haben. – SuperBiasedMan

15

printf ("Format", args) zugeordnet ist, wird verwendet, um die Daten auf die Standardausgabe zu drucken, die oft Monitor ein Computer ist .

sprintf (char *, "format", args) ist wie printf. Anstatt die formatierte Zeichenfolge auf der Standardausgabe, d. H. Einem Monitor, anzuzeigen, speichert sie die formatierten Daten in einer Zeichenfolge, auf die der Zeichenzeiger (der allererste Parameter) zeigt. Die Zeichenfolgenposition ist der einzige Unterschied zwischen printf und Sprint-Syntax.

fprintf (FILE * fp, "format", args) ist wie printf wieder.Statt die Daten auf dem Monitor anzuzeigen oder in einer Zeichenfolge zu speichern, werden die formatierten Daten stattdessen in einer Datei gespeichert, auf die der Dateizeiger zeigt, der als erster Parameter für fprintf verwendet wird. Der Dateizeiger ist die einzige Ergänzung zur Syntax von printf.

Wenn stdout Datei als der erste Parameter in fprintf verwendet wird, wird seine Arbeit dann als die von printf gleichwertig betrachtet.

Verwandte Themen