C-Programmierung: stdio.h

Aus Wikibooks

Die Datei stdio.h enthält diverse Standard-Input-Output-Funktionen (daher der Name).

FILE [Bearbeiten]

Vordefinierter Standardtyp zur Verwendung in vielen Funktionen zur Ein- und Ausgabe bei Streams bzw. Dateien. Meistens erfolgt die Instanziierung einer Variable für diesen Typ als Zeiger.

NULL [Bearbeiten]

Das Macro für einen Pointer auf einen nicht existierenden Speicherbereich wie es auch in stddef.h definiert ist.

BUFSIZ [Bearbeiten]

dieses Macro definiert die implementierungsspezifische Maximalgröße, die mit setbuf gewählt werden kann als Integerwert.

FOPEN_MAX [Bearbeiten]

Enthält als Integer die Anzahl der möglichen gleichzeitig geöffneten Filepointer, welche diese Implementierung erlaubt.

FILENAME_MAX [Bearbeiten]

Enthält als Integerwert die Maximallänge von Dateinamen mit dem die Implementierung sicher umgehen kann.

stdin [Bearbeiten]

Ist ein immer vorhandener geöffneter Filepointer auf den Standardeingabe-Stream.

stdout [Bearbeiten]

Ist ein immer vorhandener, geöffneter Filepointer auf den Standardausgabe-Stream.

stderr [Bearbeiten]

Ist ein immer vorhandener geöffneter Filepointer auf den Fehlerausgabe-Stream. Lassen Sie sich bitte nicht dadurch verwirren, dass meistens stderr auch auf der Konsole landet: Der Stream ist nicht der gleiche wie stdout.

EOF (End of File)[Bearbeiten]

negativer Wert vom Typ int , der von einigen Funktionen zurückgegeben wird wenn das Ende eines Streams erreicht wurde.

int printf (const char *format, ...)[Bearbeiten]

entspricht fprintf(stdout, const char* format, ...)

Die Umwandlungsangaben (engl. conversion specification) bestehen aus den folgenden Elementen:
  • dem  % Zeichen
  • Flags
  • der Feldbreite (engl. field width), Anzahl der Druckstellen insgesamt
  • der Genauigkeit (engl. precision), Zahl der Stellen nach dem Dezimalpunkt (bzw bei %g : Zahl der relevanten Stellen)
  • einem Längenhinweis (engl. length modifier), Art der internen Zahlspeicherung (Sonderfall)
  • dem Umwandlungszeichen (engl. conversion key)
Die Flags haben die folgende Bedeutung:
  • - (Minus): Der Text wird linksbündig ausgerichtet. Wird das Flag nicht gesetzt so wird der Text rechtsbündig ausgerichtet.
  • + (Plus): Es wird in jedem Fall ein Vorzeichen ausgegeben und zwar auch dann, wenn die Zahl positiv ist.
  • Leerzeichen: Ein Leerzeichen wird ausgegeben. Wenn sowohl + wie auch das Leerzeichen benutzt werden, so wird die Kennzeichnung nicht beachtet und es wird kein Leerzeichen ausgegeben.
  • # : Welche Wirkung das Kennzeichen # hat ist abhängig vom verwendeten Format: Wenn ein Wert über %x als Hexadezimal ausgegeben wird, so wird jedem Wert ein 0x vorangestellt (außer der Wert ist 0).
  • 0 : Die Auffüllung erfolgt mit führenden Nullen anstelle von Leerzeichen (sofern Minus-Flag nicht gesetzt).
Mögliche Umwandlungszeichen:
  • %a , %A : double im Format [-]0xh.hhhhp±d. Wird %a verwendet, so werden die Buchstaben a bis f als abcdef ausgegeben; wenn %A verwendet wird, dann werden die Buchstaben a bis f als ABCDEF ausgegeben (neu im C99 Standard).
  • %c : int umgewandelt in char und als Zeichen interpretiert.
  • %d , %i : int im Format [-]dddd .
  • %e , %E : double in Format [-]d.ddd e±dd bzw. [-]d.ddd E±dd . Die Anzahl der Stellen nach dem Dezimalpunkt entspricht der Genauigkeit. Fehlt die Angabe, so ist sie standardmäßig 6. Ist die Genauigkeit 0 und das # Flag nicht gesetzt, so entfällt der Dezimalpunkt. Der Exponent besteht immer aus mindestens zwei Ziffern. Sind mehr Ziffern zur Darstellung notwendig, so werden nur so viele wie unbedingt notwendig angezeigt. Wenn der darzustellende Wert 0 ist, so ist auch der Exponent 0.
  • %f , %F : double im Format [-]ddd.ddd . Die Anzahl der Stellen nach dem Dezimalpunkt entspricht der Genauigkeit. Fehlt die Angabe, so ist sie standardmäßig 6. Ist die Genauigkeit 0 und das # Flag nicht gesetzt, so entfällt der Dezimalpunkt.
  • %g , %G : Ein double Argument wird im Stil von e bzw. E ausgegeben, allerdings nur, wenn der Exponent kleiner als -4 ist oder größer / gleich der Genauigkeit. Ansonsten wird das Argument im Stil von %f ausgegeben.
  • %n : Das Argument muss ein vorzeichenbehafteter Zeiger sein, bei dem die Anzahl der auf dem Ausgabestrom geschriebenen Zeichen abgelegt wird.
  • %o : int als Oktalzahl im Format [-]dddd .
  • %p : void* . Der Wert des Zeigers umgewandelt in eine darstellbare Folge von Zeichen, wobei die genaue Darstellung von der Implementierung abhängig ist.
  • %s : Das Argumente sollten ein Zeiger auf das erste Element eines Zeichenarray sein. Die nachfolgenden Zeichen werden bis zum \0 ausgegeben.
  • %u : unsigned int im Format dddd
  • %X , %x : int im Hexadezimalsystem im Format [-]dddd . Wird %x verwendet, so werden die Buchstaben a bis f als abcdef ausgegeben, wenn %X verwendet wird, dann werden die Buchstaben a bis f als ABCDEF ausgegeben. Ist das # Flag gesetzt, dann erscheint die Ausgabe der Hexadezimalzahl mit einem vorangestellten "0x" (außer der Wert ist 0).
  •  %% Ein Prozentzeichen wird ausgegeben


Wenn eine Umwandlungsangabe ungültig ist oder ein Argumenttyp nicht dem Umwandlungsschlüssel entspricht, so ist das Verhalten undefiniert.

int fprintf(FILE *fp,const char *format,...)[Bearbeiten]

Die Funktion macht das gleiche wie die Funktion printf , Ausgabe aber nicht nach stdout sondern in einen Stream, der über den Filepointer fp übergeben wird.

int snprintf(char *dest, size_t destsize, const char *format, ...)[Bearbeiten]

Die Funktion snprintf() formatiert die in ... angegebenen Argumente gemäß der printf-Formatierungsvorschrift format und schreibt das Ergebnis in den durch dest angegebenen String. destsize gibt die Maximallänge des Strings dest an. Der String in dest erhält in jedem Fall ein abschließendes Nullzeichen. In keinem Fall wird über dest[destsize - 1] hinausgeschrieben.

Der Rückgabewert ist die Anzahl der Zeichen, die geschrieben worden wäre, wenn der String dest lang genug gewesen wäre.

Um Pufferüberläufe zu vermeiden, sollte diese Funktion gegenüber strcpy, strcat, strncpy und strncat vorgezogen werden, da es bei letzteren Funktionen aufwendig ist, über den noch verfügbaren Platz im String Buch zu führen.

Beispielcode[Bearbeiten]

Das folgende Programm erwartet zwei Argumente auf der Kommandozeile. Diese Argumente werden zu einem Dateinamen, bestehend aus Verzeichnisname und Dateiname, zusammengesetzt und ausgegeben.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
	ssize_t	len = 0;
	char	*fname = NULL;

	if (3 == argc) {
		len = snprintf(NULL, 0, "%s/%s", argv[1], argv[2]);
		fname = malloc( len+1 );
		if (NULL != fname)
		{
			sprintf(fname, "%s/%s", argv[1], argv[2]);
			printf("%s\n", fname); /* oder puts(fname); */
			free(fname);
			return 0; 
		}
	}
	printf("Fehler\n");
	return 1;
}
  • mit snprintf() wird zunächst die Länge des benötigten Strings ermittelt
  • mit malloc() wird dafür dynamischer Speicher reserviert
  • mit sprintf() (nicht snprintf()!) wird dieser Speicher mit dem Ergebnisstring beschrieben, auf stdout ausgegeben und das Programm mit Returncode 0 (äquivalent zu fehlerfrei) beendet, ansonsten mit 1

int sprintf(char *dest,const char *format,...)[Bearbeiten]

Achtung! Da diese Funktion nicht die Länge prüft kann es zum Pufferüberlauf kommen! Deshalb sollte besser snprintf verwendet werden. Wenn dennoch diese Funktion genutzt wird, schreibt sie in den String dest den Formatstring format und gegebenenfalls die weiteren Parameter.

int vprintf(const char *format,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vprintf ist äquivalent zu der Funktion printf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung diese Funktion ruft nicht das Makro va_end. Der Inhalt von list ist deshalb nach dem Funktionsaufruf undefiniert ! Nach der Funktion sollte die rufende Instanz deshalb unbedingt das Makro va_end als nächstes aufrufen.

int vfprintf(FILE *stream,const char *format,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vfprintf ist äquivalent zu der Funktion fprintf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung diese Funktion ruft nicht das Makro va_end. Der Inhalt von list ist deshalb nach dem Funktionsaufruf undefiniert! Nach der Funktion sollte die rufende Instanz deshalb unbedingt das Makro va_end als nächstes aufrufen.

int vsprintf(char *dest,const char *format,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsprintf ist äquivalent zu der Funktion sprintf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung diese Funktion ruft nicht das Makro va_end. Der Inhalt von list ist deshalb nach dem Funktionsaufruf undefiniert ! Nach der Funktion sollte die rufende Instanz deshalb unbedingt das Makro va_end als nächstes aufrufen.

int vsnprintf(char *dest,size_t destsize,const char *format,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsnprintf ist äquivalent zu der Funktion snprintf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung diese Funktion ruft nicht das Makro va_end. Der Inhalt von list ist deshalb nach dem Funktionsaufruf undefiniert! Nach der Funktion sollte die rufende Instanz deshalb unbedingt das Makro va_end als nächstes aufrufen.

int scanf (const char *formatString, ...)[Bearbeiten]

entspricht fscanf(stdin, const char* formatString, ...)

int fscanf(FILE *fp,const char *format,...)[Bearbeiten]

Die Funktion fscanf(FILE *fp,const char *format); liest eine Eingabe aus dem mit fp übergebenen Stream. Über den Formatstring format wird fscanf mitgeteilt welchen Datentyp die einzelnen Elemente haben, die über Zeiger mit den Werten der Eingabe gefüllt werden. Der Rückgabewert der Funktion ist die Anzahl der erfolgreich eingelesen Datentypen bzw. im Fehlerfall der Wert der Konstante EOF .

int sscanf(const char *src,const *format,...)[Bearbeiten]

Die Funktion ist äquivalent zu fscanf , außer dass die Eingabe aus dem String src gelesen wird.

int vscanf(const char *fromat,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vscanf ist äquivalent zu der Funktion scanf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung es wird nicht das Makro va_end aufgerufen. Der Inhalt von list ist nach der Funktion undefiniert!

int vsscanf(const char *src,const char *fromat,va_list list)[Bearbeiten]

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsscanf ist äquivalent zu der Funktion sscanf außer dass anstelle der variablen Argumentenliste ‘‘...’’ ein va_list-Objekt übergeben wird. Achtung es wird nicht das Makro va_end gerufen der Inhalt von list ist nach der Funktion undefiniert!

int fgetc(FILE *stream)[Bearbeiten]

Die Funktion fgetc(stream); liefert das nächste Zeichen im Stream oder im Fehlerfall EOF .

zurück