vprintf(3S) vprintf(3S)
NAME
vprintf, vfprintf, vsprintf, vwprintf, vfwprintf, vswprintf - Forma-
tierte Ausgabe einer variablen Argumentliste
SYNTAX
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>
int vprintf(const char *format, valist ap);
int vfprintf(FILE *stream, const char *format, valist ap);
int vsprintf(char *s, const char *format, valist ap);
int vwprintf(const wchart *format, valist ap);
int vfwprintf(FILE *stream, const wchart *format, valist ap);
int vswprintf(wchart *s, sizet n, const wchart *format, valist ap);
BESCHREIBUNG
vprintf(), vfprintf() und vsprintf() sind funktionsgleich mit
printf(), fprintf() und sprintf(), werden aber anstatt mit einer
variablen Reihe von Argumenten mit einer in der Include-Datei stdarg.h
definierten Argumentliste aufgerufen.
Die Funktionen vwprintf(), vfwprintf() und vswprintf() entsprechen den
Funktionen swprintf(), fwprintf() bzw. swprintf(), wobei die variable
Argumentliste durch ap ersetzt wird. ap sollte vom Makro vastart (und
möglicherweise nachfolgenden vaarg-Aufrufen) initialisiert worden
sein. Diese Funktionen rufen nicht das Makro vaend auf.
Da die Funktionen vfwprintf(), vswprintf() und vwprintf() das Makro
vaarg aufrufen, ist der Wert von ap nach der Rückkehr unbestimmt.
Die Include-Datei stdarg.h definiert den Typ valist und eine Menge
von Makros, um eine Liste von Argumenten unterschiedlicher Anzahl und
Typen durchgehen zu können. Das Argument ap ist vom Typ valist. Die-
ses Argument wird zusammen mit den Makros vastart, vaarg und vaend
aus der Include-Datei stdarg.h verwendet [siehe stdarg(5)].
BEISPIELE
Der folgende Programmausschnitt veranschaulicht die Verwendung von
vfprintf() zum Schreiben einer error-Routine:
#include <stdio.h>
#include <stdarg.h>
/*
* error should be called like
* error(functionname, format, arg1, ...);
*/
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
vprintf(3S) vprintf(3S)
void error(char *functionname, char *format, ...)
{
valist ap;
vastart(ap, format);
/* print out name of function causing error */
(void) fprintf(stderr, "ERR in %s: ", functionname);
vaarg(ap, char*);
/* print out remainder of message */
(void) vfprintf(stderr, format, ap);
vaend(ap);
(void) abort;
}
Das folgende Beispiel zeigt die Verwendung der Funktion vfwprintf() in
einer allgemeinen Fehlerberichtsroutine.
#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>
void error(char *functionname, wchart *format, ...)
{
valist ap;
vastart(ap, format);
/* print out name of function causing error */
fwprintf(stderr, L"ERROR in %s: ", functionname);
/* print out remainder of message */
vfwprintf(stderr, format, ap);
vaend(ap);
}
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Die Funktion schlägt fehl, wenn entweder der Datenstrom nicht gepuf-
fert ist oder der Puffer des Datenstroms geleert werden mußte; ferner
wenn:
EAGAIN Das Flag ONONBLOCK für den Dateideskriptor, der stream
zugrundeliegt, ist gesetzt, und der Prozeß wurde beim
Schreibvorgang verzögert.
EBADF Der Dateideskriptor, der stream zugrundeliegt, ist kein gül-
tiger Dateideskriptor, der zum Schreiben geöffnet ist.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
vprintf(3S) vprintf(3S)
EFBIG Es wurde versucht, in eine Datei zu schreiben, deren Größe
die maximale Dateigröße oder die maximale Dateigröße des
Prozesses überschreitet.
EFBIG Die Datei ist eine reguläre Datei, und es wurde versucht,
bis hin oder über den maximalen Offset hinaus zu schreiben,
der dem entsprechenden Datenstrom zugeordnet ist.
EINTR Infolge eines Signals wurde die Schreiboperation beendet,
und es wurden keine Daten übertragen.
EIO Ein physischer Ein-/Ausgabefehler ist aufgetreten, oder der
Prozeß gehört zu einer Hintergrundprozeßgruppe, welche auf
das kontrollierende Terminal zu schreiben versucht. TOSTOP
ist gesetzt, weder ignoriert noch blockiert der Prozeß
SIGTTOU, und die Prozeßgruppe des Prozesses ist verwaist.
Dieser Fehler kann auch unter implementationsabhängigen
Bedingungen gemeldet werden.
ENOSPC Es war kein freier Platz auf dem Gerät, das die Datei ent-
hält, mehr übrig.
EPIPE Es wurde versucht, auf eine Pipe oder FIFO zu schreiben, die
für keinen Prozeß leseberechtigt ist. Es wird auch ein Sig-
nal SIGPIPE zum Prozeß gesendet.
Die Funktion kann fehlschlagen, falls:
EILSEQ Ein Wide-Character-Code, dem kein gültiges Zeichen ent-
spricht, wurde entdeckt.
EINVAL Es sind nicht genügend Argumente vorhanden.
ENOMEM Es ist nur unzureichend Speicherplatz vorhanden.
ENXIO Es wurde eine Anforderung an ein nicht-existierendes Gerät
gemacht bzw. die Anforderung ist außerhalb der Möglichkeiten
des Geräts.
RÜCKGABEWERTE
vprintf() und vfprintf() geben die Anzahl der übertragenen Zeichen
oder, wenn ein Fehler aufgetreten ist, -1 zurück.
Die Funktionen vwprintf() und vfwprintf() geben die Anzahl der über-
tragenen Wide-Characters oder, wenn ein Ausgabefehler aufgetreten ist,
einen negativen Wert zurück.
Die Funktion vswprintf() gibt die Anzahl der in den Array geschriebe-
nen Wide-Characters zurück, ohne abschließendes Null-Wide-Character
Wenn n oder mehr Wide-Characters generiert werden sollten, wird ein
negativer Wert zurückgegeben.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
vprintf(3S) vprintf(3S)
HINWEISE
Nach der Verwendung dieser Funktionen sollten Sie das Makro vaend(ap)
aufrufen, um den Zeiger ap wieder auf einen definierten Wert zu set-
zen, so daß eventuell nachfolgende Aufrufe dieser Funktionen korrekte
Startwerte haben.
SIEHE AUCH
printf(3S), lfs(5), stdarg(5), stdio(5), wchar(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98