Unterschied zwischen fprintf, printf und sprintf?

232

Kann jemand in einfachem Englisch über die Unterschiede zwischen erklären printf, fprintfund sprintfmit Beispielen?

In welchem ​​Stream ist es?

Ich bin wirklich verwirrt zwischen diesen drei, während ich über "File Handling in C" lese.

Vishwanath Dalvi
quelle
4
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:

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

In diesem Beispiel zeigt stdinjetzt auf inputfile.dat, stdoutzeigt auf output.txtund stderrzeigt auf errors.txt.

fprintf schreibt formatierten Text in den von Ihnen angegebenen Ausgabestream.

printfentspricht dem Schreiben fprintf(stdout, ...)und schreibt formatierten Text an die Stelle, auf die der Standardausgabestream gerade zeigt.

sprintfschreibt formatierten Text in ein Array von charim Gegensatz zu einem Stream.

John Bode
quelle
4
"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*)

Moo-Saft
quelle
39

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.

Rubal
quelle
24

printf(...)ist äquivalent zu fprintf(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, vfprintfundvprintf

VGE
quelle
Die vAromen sind nicht Standard, glaube ich
John Dibling
8
Die vAromen entsprechen mit Sicherheit dem C-Standard.
Fred Foo
@ Larsmans: Ah, ok. danke für die Korrektur. Diese Frage wurde an einem Punkt mit [c ++]
John Dibling
2

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

$ 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)
Maxim Egorushkin
quelle
+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

  1. printf wird verwendet, um die Ausgabe auf dem Bildschirm durchzuführen.
  2. Syntax = printf("control string ", argument );
  3. Es ist nicht mit der Eingabe / Ausgabe von Dateien verknüpft

fprintf

  1. Der fprintf, mit dem der Schreibvorgang in der Datei ausgeführt wurde, auf die das FILE-Handle zeigt.
  2. Die Syntax lautet fprintf (filename, "control string ", argument );
  3. Es ist mit der Eingabe / Ausgabe von Dateien verbunden
Amit Vasava
quelle
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

kavamsi12
quelle
0

sprintf: Schreibt formatierte Daten anstelle von stdout in eine Zeichenfolge im Speicher

Die Syntax von sprintf lautet:

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

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:

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.

Fahad Ali
quelle