C-Programmierung: stdio.h

Aus Wikibooks
Wechseln zu: Navigation, Suche

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

Inhaltsverzeichnis

[Bearbeiten] FILE

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.

[Bearbeiten] NULL

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

[Bearbeiten] BUFSIZE

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

[Bearbeiten] FOPEN_MAX

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

[Bearbeiten] FILENAME_MAX

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

[Bearbeiten] stdin

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

[Bearbeiten] stdout

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

[Bearbeiten] stderr

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.

[Bearbeiten] EOF (End of File)

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

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

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.

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

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.

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

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.

[Bearbeiten] Beispielcode

Das folgende Programm erwartet zwei Argumente auf der Kommandozeile. Diese Argumente werden zu einem Dateinamen, bestehend aus Verzeichnisname und Dateiname, zusammengesetzt und ausgegeben. Falls der Dateiname zu lang für den Puffer wird, wird eine Fehlermeldung ausgegeben.

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

int main(int argc, char **argv)
{
  char fname[256];

  if (argc == 3) {
    if (snprintf(fname, sizeof(fname), "%s/%s", argv[1], argv[2]) >= sizeof(fname)) {
      fprintf(stderr, "Fehler: Dateiname zu lang.\n");
      exit(EXIT_FAILURE);
    }
    printf("%s\n", fname);
  }
  return EXIT_SUCCESS;
}

Besonders zu beachten sind die folgenden Punkte:

  • Für den Parameter destsize von snprintf() wird der Wert durch den sizeof-Operator berechnet und nicht etwa direkt angegeben. Dadurch muss bei späteren Änderungen die 256 nur an genau einer Stelle verändert werden. Das beugt Fehlern vor.
  • Wenn der Rückgabewert von snprintf() mindestens so groß wie sizeof(fname) ist, bedeutet das, dass 256 reguläre Zeichen und das abschließende Nullzeichen in den Puffer geschrieben werden sollten. Dafür ist aber kein Platz gewesen, und es wurde ein Teil des Strings abgeschnitten.

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

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.

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vprintf ist äquivalent zu der Funktion printf außer dass eine variable Argumentenliste anstelle des ‘‘...’’-Operators genutzt 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.

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vfprintf ist äquivalent zu der Funktion fprintf außer dass eine variable Argumentenliste anstelle des ...-Operators genutzt 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.

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsprintf ist äquivalent zu der Funktion sprintf außer dass eine variable Argumentenliste anstelle des ‘‘...’’-Operators genutzt 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.

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsnprintf ist äquivalent zu der Funktion snprintf außer dass eine variable Argumentenliste anstelle des ‘‘...’’-Operators genutzt 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.

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

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

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

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 .

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

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

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vscanf ist äquivalent zu der Funktion scanf außer dass mit einer Argumentenliste gearbeitet wird. Achtung es wird nicht das Makro va_end aufgerufen. Der Inhalt von list ist nach der Funktion undefiniert!

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

Es wird zusätzlich der Header stdarg.h benötigt ! Die Funktion vsscanf ist äquivalent zu der Funktion sscanf außer dass mit einer Argumentenliste gearbeitet wird. Achtung es wird nicht das Makro va_end gerufen der Inhalt von list ist nach der Funktion undefiniert!

[Bearbeiten] int fgetc(FILE *stream)

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

zurück

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Navigation
Mitmachen
Werkzeuge
Drucken/exportieren