Experimentieren Sie mit ihnen, indem Sie einen Beispielcode schreiben. Das ist eine sehr einfache Möglichkeit, den Unterschied zwischen ihnen klar zu verstehen.
Nawaz
14
Ziehen Sie snprintf () sprintf () vor, um dumme Pufferüberläufe zu vermeiden.
Maxim Egorushkin
3
Bevorzugen Sie Streams oder Boost-Formatierer, um dumme Pufferüberläufe und böse Fehler zu vermeiden
John Dibling
7
@Maxim, während Sie einen gültigen Punkt ansprechen, gehe ich davon aus, dass meine Puffer nicht überlaufen und meine App in Stücke sprengen. Ich würde mir diese Funktionen immer nur ansehen, wenn sich herausstellen würde, dass die Streams / Boost-Formatierer spürbare Engpässe verursachen. :)
Moo-Juice
1
@ Maxim: Punkt ist, es gibt keine Notwendigkeit. Mein Code ist kein Engpass. 5 m / s gibt an, wie viele Nachrichten der Austausch sendet, nicht wie viele wir verarbeiten können. Warum also vorzeitig optimieren?
John Dibling
Antworten:
235
In C ist ein "Strom" eine Abstraktion; Aus Sicht des Programms handelt es sich lediglich um einen Produzenten (Eingabestream) oder einen Konsumenten (Ausgabestream) von Bytes. Es kann einer Datei auf der Festplatte, einer Pipe, Ihrem Terminal oder einem anderen Gerät wie einem Drucker oder einem tty entsprechen. Der FILETyp enthält Informationen zum Stream. Normalerweise spielen Sie nicht FILEdirekt mit dem Inhalt eines Objekts, sondern übergeben lediglich einen Zeiger auf die verschiedenen E / A-Routinen.
Es gibt drei Standard-Streams: stdinist ein Zeiger auf den Standardeingabestream, stdoutist ein Zeiger auf den Standardausgabestream und stderrist ein Zeiger auf den Standardfehlerausgabestream. In einer interaktiven Sitzung beziehen sich die drei normalerweise auf Ihre Konsole, obwohl Sie sie so umleiten können, dass sie auf andere Dateien oder Geräte verweisen:
"Es ist einfach ein Produzent (Eingabestream) oder Konsument (Ausgabestream) von Bytes." Sind diese rückwärts? Würde ein Produzent nicht etwas kreieren (ausgeben)? Fragen, weil ich es wirklich nicht weiß.
Dave Voyles
6
@ DaveVoyles: Diese sind aus der Perspektive Ihres Programms. Ein Eingabestream erzeugt Bytes, die Ihr Programm lesen kann. Ein Ausgabestream verbraucht die von Ihrem Programm erzeugten Bytes.
John Bode
153
printfAusgaben an den Standardausgabestream ( stdout)
fprintfgeht zu einem Dateihandle ( FILE*)
sprintfgeht zu einem Puffer, den Sie zugewiesen haben. ( char*)
printf ("format", args) wird verwendet, um die Daten auf die Standardausgabe zu drucken, bei der es sich häufig um einen Computermonitor handelt.
sprintf (char *, "format", args) ist wie printf. Beim Anzeigen der formatierten Zeichenfolge in der Standardausgabe, dh auf einem Monitor, werden die formatierten Daten in einer Zeichenfolge gespeichert, auf die der Zeichenzeiger zeigt (der allererste Parameter). Die Position der Zeichenfolge ist der einzige Unterschied zwischen der printf- und der Sprint-Syntax.
fprintf (FILE * fp, "format", args) ist wieder wie printf. Hier werden stattdessen beim Anzeigen der Daten auf dem Monitor oder beim Speichern in einer Zeichenfolge die formatierten Daten 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 die Datei stdout als erster Parameter in fprintf verwendet wird, wird ihre Funktionsweise als gleichwertig mit der von printf angesehen.
+1 nützlich in der Tat, aber beachten Sie, dass dies vsnprintfeine Nicht-Standardfunktion ist. Die meisten Implementierungen, die ich gesehen habe, implementieren dies oder ähnliches, aber es ist implementierungsspezifisch.
John Dibling
1
@ Larsmans erwähnt oben, dass dies tatsächlich ein Teil des C-Standards ist, also nehme ich das zurück
John Dibling
2
Was hat das mit C zu tun?
Onemasse
2
printf
printf wird verwendet, um die Ausgabe auf dem Bildschirm durchzuführen.
Syntax = printf("control string ", argument );
Es ist nicht mit der Eingabe / Ausgabe von Dateien verknüpft
fprintf
Der fprintf, mit dem der Schreibvorgang in der Datei ausgeführt wurde, auf die das FILE-Handle zeigt.
Die Syntax lautet fprintf (filename, "control string ", argument );
Es ist mit der Eingabe / Ausgabe von Dateien verbunden
Wenn dies von einem anderen Ort zitiert wird, ist es am besten, die Quelle mit einem Link zu zitieren, aber den Text, den Sie hier zitiert haben, auf jeden Fall beizubehalten.
SuperBiasedMan
0
fprintfDies bezieht sich auf Streams, bei denen printfeine Anweisung ähnlich, fprintfaber nicht auf Streams bezogen ist, dh auf fprintfDateien
String bezieht sich auf den Zeiger auf einen Puffer im Speicher, in den die Daten geschrieben werden sollen.
Format bezieht sich auf einen 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, oder mit anderen Worten, die Anzahl der geschriebenen Zeichen ohne Berücksichtigung des abschließenden Nullzeichens wird zurückgegeben und gibt im Fehlerfall einen Wert kleiner als Null zurück.
printf: Druckt nach Standard
Die Syntax für printf lautet:
printf format [argument]…
Der einzige Unterschied zwischen sprintf () und printf () besteht darin, dass sprintf () Daten in ein Zeichenarray schreibt, während printf () Daten in stdout, das Standardausgabegerät, schreibt.
Antworten:
In C ist ein "Strom" eine Abstraktion; Aus Sicht des Programms handelt es sich lediglich um einen Produzenten (Eingabestream) oder einen Konsumenten (Ausgabestream) von Bytes. Es kann einer Datei auf der Festplatte, einer Pipe, Ihrem Terminal oder einem anderen Gerät wie einem Drucker oder einem tty entsprechen. Der
FILE
Typ enthält Informationen zum Stream. Normalerweise spielen Sie nichtFILE
direkt mit dem Inhalt eines Objekts, sondern übergeben lediglich einen Zeiger auf die verschiedenen E / A-Routinen.Es gibt drei Standard-Streams:
stdin
ist ein Zeiger auf den Standardeingabestream,stdout
ist ein Zeiger auf den Standardausgabestream undstderr
ist ein Zeiger auf den Standardfehlerausgabestream. In einer interaktiven Sitzung beziehen sich die drei normalerweise auf Ihre Konsole, obwohl Sie sie so umleiten können, dass sie auf andere Dateien oder Geräte verweisen:In diesem Beispiel zeigt
stdin
jetzt aufinputfile.dat
,stdout
zeigt aufoutput.txt
undstderr
zeigt auferrors.txt
.fprintf
schreibt formatierten Text in den von Ihnen angegebenen Ausgabestream.printf
entspricht dem Schreibenfprintf(stdout, ...)
und schreibt formatierten Text an die Stelle, auf die der Standardausgabestream gerade zeigt.sprintf
schreibt formatierten Text in ein Array vonchar
im Gegensatz zu einem Stream.quelle
printf
Ausgaben an den Standardausgabestream (stdout
)fprintf
geht zu einem Dateihandle (FILE*
)sprintf
geht zu einem Puffer, den Sie zugewiesen haben. (char*
)quelle
printf ("format", args) wird verwendet, um die Daten auf die Standardausgabe zu drucken, bei der es sich häufig um einen Computermonitor handelt.
sprintf (char *, "format", args) ist wie printf. Beim Anzeigen der formatierten Zeichenfolge in der Standardausgabe, dh auf einem Monitor, werden die formatierten Daten in einer Zeichenfolge gespeichert, auf die der Zeichenzeiger zeigt (der allererste Parameter). Die Position der Zeichenfolge ist der einzige Unterschied zwischen der printf- und der Sprint-Syntax.
fprintf (FILE * fp, "format", args) ist wieder wie printf. Hier werden stattdessen beim Anzeigen der Daten auf dem Monitor oder beim Speichern in einer Zeichenfolge die formatierten Daten 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 die Datei stdout als erster Parameter in fprintf verwendet wird, wird ihre Funktionsweise als gleichwertig mit der von printf angesehen.
quelle
printf(...)
ist äquivalent zufprintf(stdout,...)
.fprintf
wird zur Ausgabe zum Streamen verwendet.sprintf(buffer,...)
wird verwendet, um eine Zeichenfolge in einen Puffer zu formatieren.Hinweis gibt es auch
vsprintf
,vfprintf
undvprintf
quelle
v
Aromen sind nicht Standard, glaube ichv
Aromen entsprechen mit Sicherheit dem C-Standard.Mit der Funktion vsnprintf () können Sie auch sehr nützliche Dinge tun:
quelle
vsnprintf
eine Nicht-Standardfunktion ist. Die meisten Implementierungen, die ich gesehen habe, implementieren dies oder ähnliches, aber es ist implementierungsspezifisch.printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
quelle
fprintf
Dies bezieht sich auf Streams, bei denenprintf
eine Anweisung ähnlich,fprintf
aber nicht auf Streams bezogen ist, dh auffprintf
Dateienquelle
sprintf: Schreibt formatierte Daten anstelle von stdout in eine Zeichenfolge im Speicher
Die Syntax von sprintf lautet:
Hier,
String bezieht sich auf den Zeiger auf einen Puffer im Speicher, in den die Daten geschrieben werden sollen.
Format bezieht sich auf einen 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, oder mit anderen Worten, die Anzahl der geschriebenen Zeichen ohne Berücksichtigung des abschließenden Nullzeichens wird zurückgegeben und gibt im Fehlerfall einen Wert kleiner als Null zurück.
printf: Druckt nach Standard
Die Syntax für printf lautet:
Der einzige Unterschied zwischen sprintf () und printf () besteht darin, dass sprintf () Daten in ein Zeichenarray schreibt, während printf () Daten in stdout, das Standardausgabegerät, schreibt.
quelle