Unterschied zwischen fprintf, printf und sprintf?

Lesezeit: 6 Minuten

Benutzeravatar von Vishwanath Dalvi
Vishwanath Dalvi

Kann jemand in einfachem Englisch die Unterschiede zwischen erklären printf, fprintfund sprintf mit Beispielen?

In welchem ​​Stream ist es?

Ich bin wirklich verwirrt zwischen den dreien, wenn ich über “File Handling in C” lese.

  • Experimentieren Sie mit ihnen, indem Sie Beispielcode schreiben. Das ist sehr einfach deutlich den Unterschied zwischen ihnen verstehen.

    – Nawaz

    7. Januar 2011 um 15:56 Uhr

  • Bevorzugen Sie snprintf() gegenüber sprintf(), um dumme Pufferüberläufe zu vermeiden.

    – Maxim Egorushkin

    7. Januar 2011 um 16:00 Uhr

  • Bevorzugen Sie Streams oder Boost-Formatierer, um blöde Pufferüberläufe und fiese Type-Unsafety-Bugs zu vermeiden

    – Johannes Dibling

    7. Januar 2011 um 16:09 Uhr

  • @Maxim, während Sie einen gültigen Punkt ansprechen, nehme ich die Sicherheit in dem Wissen, dass meine Puffer nicht überlaufen und meine App in Stücke explodieren werden. Ich würde mir diese Funktionen nur dann ansehen, wenn sich herausstellte, dass die Streams/Boost-Formatierer merkliche Engpässe verursachen. 🙂

    – Muh-Saft

    7. Januar 2011 um 16:17 Uhr

  • @Maxim: Punkt ist, es besteht keine Notwendigkeit. Mein Code ist kein Flaschenhals. 5 m/s sind die Anzahl der Nachrichten, die der Austausch sendet, nicht die Anzahl, die wir verarbeiten können. Warum also vorzeitig optimieren?

    – Johannes Dibling

    7. Januar 2011 um 16:58 Uhr


Benutzeravatar von John Bode
Johannes Bode

In C ist ein “Stream” eine Abstraktion; Aus der Sicht des Programms ist es einfach ein Erzeuger (Eingabestrom) oder Verbraucher (Ausgabestrom) von Bytes. Es kann einer Datei auf der Festplatte, einer Pipe, Ihrem Terminal oder einem anderen Gerät wie einem Drucker oder tty entsprechen. Das FILE Typ enthält Informationen über den Stream. Normalerweise legt man sich nicht mit a an FILE den Inhalt des Objekts direkt, Sie übergeben einfach einen Zeiger darauf an die verschiedenen I/O-Routinen.

Es gibt drei Standardstreams: stdin ist ein Zeiger auf den Standard-Eingabestrom, stdout ist ein Zeiger auf den Standardausgabestrom, und stderr ist ein Zeiger auf den Standardfehlerausgabestrom. In einer interaktiven Sitzung beziehen sich die drei normalerweise auf Ihre Konsole, obwohl Sie sie umleiten können, um auf andere Dateien oder Geräte zu verweisen:

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

In diesem Beispiel stdin weist jetzt darauf hin inputfile.dat, stdout verweist auf output.txtund stderr verweist auf errors.txt.

fprintf schreibt formatierten Text in den von Ihnen angegebenen Ausgabestream.

printf ist gleichbedeutend mit Schreiben fprintf(stdout, ...) und schreibt formatierten Text dorthin, wohin der Standardausgabestrom gerade zeigt.

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

  • “Es ist einfach ein Erzeuger (Eingabestrom) oder Verbraucher (Ausgabestrom) von Bytes.” Sind diese rückständig? Würde ein Produzent nicht etwas erschaffen (ausgeben)? Frage, weil ich es wirklich nicht weiß.

    – Dave Voyles

    6. März 2017 um 22:02 Uhr

  • @DaveVoyles: Diese sind aus der Perspektive Ihres Programms. Ein Eingabestrom erzeugt Bytes, die Ihr Programm lesen kann; Ein Ausgabestrom verbraucht die von Ihrem Programm erzeugten Bytes.

    – Johannes Bode

    6. März 2017 um 23:52 Uhr


  • für alle, die denken, was die f Präfix/Suffix ist für. Ich dachte zunächst, die f in printf / sprintf / scanf meint Datei. Aber es bedeutet nur Format.

    – mfaani

    17. März 2021 um 13:10 Uhr


printf gibt in den Standardausgabestrom aus (stdout)

fprintf geht zu einem Dateihandle (FILE*)

sprintf geht zu einem Puffer, den Sie zugewiesen haben. (char*)

Benutzeravatar von Rubal
Rubel

  • printf(const char *format, ...) wird verwendet, um die Daten auf die Standardausgabe zu drucken, die häufig ein Computermonitor ist.
  • sprintf(char *str, const char *format, ...) ist wie printf. Anstatt die formatierte Zeichenfolge auf der Standardausgabe, dh einem Monitor, anzuzeigen, speichert es die formatierten Daten in einer Zeichenfolge, auf die der char-Zeiger (der allererste Parameter) zeigt. Der String-Speicherort ist der einzige Unterschied zwischen der printf- und der sprint-Syntax.
  • fprintf(FILE *stream, const char *format, ...) ist wie printf wieder. Anstatt die Daten auf dem Monitor anzuzeigen oder in einer Zeichenfolge zu speichern, werden hier die formatierten Daten in einer Datei gespeichert, auf die durch den Dateizeiger gezeigt wird, der als erster Parameter für verwendet wird fprintf. Der Dateizeiger ist die einzige Ergänzung zur Syntax von printf.

Wenn stdout Datei wird als erster Parameter in verwendet fprintfseine Funktionsweise wird dann als gleichwertig mit der von angesehen printf.

Benutzeravatar von VGE
VGE

printf(...) ist äquivalent zu fprintf(stdout,...).

fprintf wird zur Ausgabe in den Stream verwendet.

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

Beachten Sie, dass es auch gibt vsprintf, vfprintf und vprintf

Sie können auch sehr nützliche Dinge mit der Funktion vsnprintf() 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)

  • +1 in der Tat nützlich, aber seien Sie sich dessen bewusst vsnprintf ist eine Nicht-Standard-Funktion. Die meisten Implementierungen, die ich gesehen habe, implementieren dies oder etwas Ähnliches, aber es ist implementierungsspezifisch.

    – Johannes Dibling

    7. Januar 2011 um 16:38 Uhr

  • @larsmans erwähnt oben, dass dies tatsächlich ein Teil des C-Standards ist, also nehme ich das zurück

    – Johannes Dibling

    7. Januar 2011 um 16:39 Uhr

  • Was hat das mit C zu tun?

    – eine Masse

    7. Januar 2011 um 17:05 Uhr

chux – Stellt Monicas Benutzeravatar wieder her
Chux – Wiedereinsetzung von Monica

Druckf

  1. Für die Ausgabe auf dem Bildschirm wird printf verwendet.
  2. Syntax = printf("control string ", argument );
  3. Es ist nicht mit der Dateieingabe/-ausgabe verbunden

fprintf

  1. Das fprintf, das verwendet wird, um einen Schreibvorgang in der Datei auszuführen, auf die das FILE-Handle zeigt.
  2. Die Syntax ist fprintf (filename, "control string ", argument );
  3. Es ist mit der Dateieingabe/-ausgabe verbunden

  • +1 in der Tat nützlich, aber seien Sie sich dessen bewusst vsnprintf ist eine Nicht-Standard-Funktion. Die meisten Implementierungen, die ich gesehen habe, implementieren dies oder etwas Ähnliches, aber es ist implementierungsspezifisch.

    – Johannes Dibling

    7. Januar 2011 um 16:38 Uhr

  • @larsmans erwähnt oben, dass dies tatsächlich ein Teil des C-Standards ist, also nehme ich das zurück

    – Johannes Dibling

    7. Januar 2011 um 16:39 Uhr

  • Was hat das mit C zu tun?

    – eine Masse

    7. Januar 2011 um 17:05 Uhr

Benutzeravatar von Fahad Ali
Fahad Ali

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

Syntax von sprintf ist:

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

Hier,

String bezieht sich auf den Zeiger auf einen Puffer im Speicher, wo die Daten geschrieben werden sollen.

Format bezieht sich auf einen Zeiger auf eine Zeichenkette, 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 anders ausgedrückt, die Anzahl der geschriebenen Zeichen ohne das abschließende Nullzeichen wird zurückgegeben und gibt einen Wert kleiner Null zurück, wenn ein Fehler aufgetreten ist.

printf: Druckt auf stdout

Syntax für printf ist:

printf format [argument]…

Der einzige Unterschied zwischen sprintf() und printf() besteht darin, dass sprintf() Daten in ein Zeichenarray schreibt, während printf() Daten auf stdout, das Standardausgabegerät, schreibt.

1426460cookie-checkUnterschied zwischen fprintf, printf und sprintf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy