Kann jemand in einfachem Englisch über die Unterschiede zwischen erklären printf
, fprintf
und sprintf
mit Beispielen?
In welchem Stream ist es?
Ich bin wirklich verwirrt zwischen diesen drei, während ich über "File Handling in C" lese.
Kann jemand in einfachem Englisch über die Unterschiede zwischen erklären printf
, fprintf
und sprintf
mit Beispielen?
In welchem Stream ist es?
Ich bin wirklich verwirrt zwischen diesen drei, während ich über "File Handling in C" lese.
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 nicht FILE
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 und stderr
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:
$ myprog < inputfile.dat > output.txt 2> errors.txt
In diesem Beispiel zeigt stdin
jetzt auf inputfile.dat
, stdout
zeigt auf output.txt
und stderr
zeigt auf errors.txt
.
fprintf
schreibt formatierten Text in den von Ihnen angegebenen Ausgabestream.
printf
entspricht dem Schreiben fprintf(stdout, ...)
und schreibt formatierten Text an die Stelle, auf die der Standardausgabestream gerade zeigt.
sprintf
schreibt formatierten Text in ein Array von char
im Gegensatz zu einem Stream.
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.
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
, vfprintf
undvprintf
v
Aromen sind nicht Standard, glaube ich
v
Aromen entsprechen mit Sicherheit dem C-Standard.
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)
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 );
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.