Anfang zurück vorwärts Ende
ANSI C - Ein Programmierkurs - Teil X
Die ANSI-Bibliotheken
Zu einem C-Compiler gehören auch noch umfangreiche Bibliotheken, die
ebenfalls nach ANSI genormt sind. Im Folgenden werden diese Bibliotheken
kurz vorgestellt. Die Reihenfolge orientiert sich an den Include-Dateien,
in denen die entsprechenden Prototypen zu finden sind. Diese Beschreibung
ersetzt keine ausführliche Beschreibung eines Lehrbuchs, sondern soll nur
einen Überblick darüber geben, was mit ANSI C mitgeliefert wird.
stdio.h
Die stdio.h enthält Funktionen für Ein- und Ausgabe. Das sind
zum einen Funktionen, die auf einen Datenstrom (stream) arbeiten, der
einer Datei oder einem Gerät zugeordnet werden kann. Diese Funktionen
haben einen Parameter vom Typ FILE *, der den stream
beschreibt. Die Struktur FILE soll von einem Benutzer nicht verändert
werden! Ein stream muss vor seiner Verwendung geöffnet (fopen) und nach
seiner Verwendung geschlossen (fclose) werden. Die Daten eines streams
werden gepuffert, so dass nicht für jedes Byte ein Zugriff auf die
Platte nötig ist. Zusätzlich gibt es noch Funktionen, die auf den
Standardkanälen für Ein- und Ausgabe arbeiten. Dies sind die streams
stdin, stdout und stderr, die schon ab Programmstart offen sind.
- void clearerr( FILE *stream );
- Diese Funktion löscht intern gespeicherte Informationen über den zuletzt
aufgetretenen Fehler bei Verwendung von stream.
- int fclose( FILE *stream );
- Diese Funktion schließt einen Stream. Damit werden auch sämtliche Daten
im Puffer geschrieben.
- int feof( FILE *stream );
- Diese Funktion prüft, ob das Dateiende erreicht ist. Ein Wert ungleich
Null bedeutet, dass das Dateiende erreicht ist.
- int ferror( FILE *stream );
- Diese Funktion prüft, ob ein Fehler bei der Benutzung von stream
aufgetreten ist. Ein Wert ungleich Null bedeutet, dass ein Fehler
aufgetreten ist.
- int fflush( FILE *stream );
- Diese Funktion schreibt die noch im Puffer befindlichen Daten in den
stream.
- int fgetc( FILE *stream );
- Diese Funktion liest ein Zeichen (unsigned char) aus dem Stream. Wenn
kein Zeichen zur Verfügung steht, wird EOG geliefert.
- int getc( FILE *stream );
- Diese Funktion ist äquivalent zu fgetc, kann aber als Makro definiert
sein.
- int getchar( void );
- Diese Funktion ist äquivalent zu getc(stdin).
- int fgetpos( FILE *stream, fpos_t *pos );
- Diese Funktion speichert die momentane Position innerhalb der Datei in
die Variable pos, um sie z.B. mittels fsetpos später wieder anzuspringen.
- char *fgets( char *str, int n, FILE *stream );
- Diese Funktion liest eine Zeile in die Variable str. Der Parameter n gibt
an, wieviel Zeichen inklusive der abschließenden Null str aufnehmen kann.
- FILE *fopen( const char *filename, const char *mode );
- Diese Funktion öffnet eine Datei und ordnet sie einem stream zu. Da unter
UNIX und MiNT die Geräte bzw. Schnittstellen eine Repräsentation im
Dateisystem haben, lassen sich hier auch streams für Schnittstellen
öffnen. Unter MiNT sind dies die Dateien im Verzeichnis u:\dev. Wenn die
Datei nicht existiert, wird NULL zurückgegeben. Der Parameter mode gibt
den Zugriffsmodus an:
- "w"
- Die Datei wird zum Schreiben geöffnet. Wenn die Datei nicht existiert,
wird sie angelegt. Existiert die Datei, wird sie gelöscht.
- "r"
- Die Datei wird zum Lesen geöffnet. Die Datei muss existieren.
- "w+"
- Die Datei wird zum Schreiben und Lesen geöffnet. Wenn die Datei
nicht existiert, wird sie angelegt. Existiert die Datei, wird sie
gelöscht. Wird zwischen Lesen und Schreiben gewechselt, muss entweder
fflush aufgerufen oder der Dateizeiger mittels fseek neu
positioniert werden.
- "r+"
- Die Datei wird zum Lesen und zum Schreiben geöffnet. Die Datei muss
existieren. Wird zwischen Lesen und Schreiben gewechselt, muss entweder
fflush aufgerufen oder der Dateizeiger mittels fseek neu
positioniert werden.
- "a"
- Die Datei wird zum Anhängen geöffnet. Die Datei muss existieren.
Enthält der Mode nach dem ersten Zeichen noch ein b, z.B. "rb" oder
"w+b", wird die Datei im Binärmodus geöffnet. Ein Öffnen im Textmodus
bedeutet auf Ataris oder PCs auch, dass ein Linefeed '\n' im Stream zu
einem CR/LF in der Datei gewandelt wird. Beim Einlesen wird entsprechend
ein Return gefolgt von einem Linefeed zu einem Linefeed. Damit wird in
der Datei oder bei der Bildschirmausgabe das Zeilenende benutzt, dass das
System benutzt. In der Zeichenkette im C-Programm wird immer '\n' als
Zeilenende benutzt.
- int fprintf( FILE *stream, const char *format, ... );
- Diese Funktion schreibt beliebige Parameter anhand der Informationen, die
der Formatstring format vorgibt. Nach dem Formatstring folgen die
Variablen oder Konstanten, die ausgegeben werden sollen.
- int fputc( int ch, FILE *stream );
- Diese Funktion schreibt ein Zeichen (unsigned char).
- int putc( int ch, FILE *stream );
- Diese Funktion ist äquivalent zu fputc, kann aber als Makro definiert
sein.
- int putchar( int c );
- Diese Funktion ist äquivalent zu putc( c, stdout);
- int fputs( const char *str, FILE *stream );
- Diese Funktion schreibt eine Zeichenkette.
- size_t fread( void *buf, size_t elem_Siz, size_t count, FILE *stream );
- Diese Funktion liest count Elemente der Größe elem_Siz in den Puffer buf
ein. Die Funktion gibt die Anzahl der gelesenen Elemente zurück.
- FILE *freopen( const char *filename, const char *mode, FILE *stream );
- Diese Funktion öffnet eine Datei und ordnet sie einem vorhandenen Stream
zu. Damit lassen sich z.B. die Dateien ändern, die stdin, stdout und
stderr zugeordnet sind.
- int fscanf( FILE *stream, const char *format, ... );
- Diese Funktion liest Daten ein; das Format der Daten wird durch den
Formatstring format vorgegeben. Anschließend folgen die Adressen der
Variablen, in die eingelesen werden soll.
- int fseek( FILE *stream, long offset, int mode );
- Diese Funktion legt fest, ab welcher Position in der Datei weitere Ein-
und Ausgaben erfolgen. Es wird also der Dateizeiger neu positioniert. Der
Parameter mode gibt an, bezüglich welcher Stelle in der Datei neu
positioniert werden soll:
- SEEK_SET
- Positioniert relativ zum Dateianfang.
- SEEK_CUR
- Positioniert relativ zur aktuellen Position.
- SEEK_END
- Positioniert relativ zum Dateiende.
- void rewind( FILE *stream);
- Diese Funktion ist äquivalent zu
fseek(strem,0,SEEK_SET); clearerr(stream);
- int fsetpos( FILE *stream, const fpos_t *pos );
- Diese Funktion setzt den Dateizeiger wieder an die Stelle, die mittels
fgetpos gespeichert wurde.
- long ftell( FILE *stream );
- Diese Funktion liefert die Position innerhalb der Datei.
- size_t fwrite( const void *buf, size_t elem_Siz, size_t count, FILE *stream );
- Diese Funktion schreibt count Elemente der Größe elem_Siz aus dem Puffer
buf. Die Funktion gibt die Anzahl der geschriebenen Elemente zurück.
- char *gets( char *str );
- Diese Funktion liest die nächste Zeile von der Standardeingabe ein.
- void perror( char *s );
- Diese Funktion gibt zuerst s und dann eine Fehlermeldung passend zu
dem aktuellen Wert der Variable errno aus. Der Text ist von der
Implementierung abhängig.
- int printf( const char *format, ... );
- Diese Funktion verhält sich wie fprintf, gibt aber auf die
Standardausgabe aus.
- int puts( const char *str );
- Diese Funktion schreibt eine Zeichenkette auf die Standardausgabe.
- int scanf( const char *format, ... );
- Diese Funktion verhält sich wie fscanf, liest aber von der
Standardeingabe.
- void setbuf( FILE *stream, char *buf );
- Wird für buf der Wert NULL übergeben, wird für den Stream die Pufferung
ausgeschaltet. Für einen Wert ungleich NULL ist die Funktion äquivalent
zu setvbuf(stream, buf, _IOFBF, BUFSIZ);
- int setvbuf( FILE *stream, char *buf, int type, size_t size );
- Diese Funktion legt die Pufferung fest und muss vor allen anderen
Operationen auf diesen Stream aufgerufen werden. Hat buf den Wert NULL,
wird ein eigener Puffer angelegt, ansonsten wird buf verwendet. Der Wert
size gibt die Puffergröße an. Der Wert type gibt die Art der Pufferung
an:
- _IOFBF
- Die Datei wird vollständig gepuffert.
- _IOLBF
- Die Textdatei wird zeilenweise gepuffert.
- _IONBF
- Die Datei wird nicht gepuffert.
- int sprintf( char *string, const char *format, ... );
- Diese Funktion verhält sich wie fprintf, gibt aber in eine Zeichenkette
aus.
- int sscanf( char *string, const char *format, ... );
- Diese Funktion verhält sich wie fscanf, liest aber aus einer Zeichenkette.
- char *tmpnam( char *s );
- Wird NULL übergeben, erzeugt diese Funktion einen Namen, der als
Dateiname für eine temporäre Datei verwendet werden kann. Es ist
sichergestellt, dass noch keine Datei mit diesen Namen existiert. Wird
ein Name, der mindestens L_tmpnam Zeichen enthält, übergeben, wird
dieser gespeichert und als Ergebnis geliefert.
- FILE *tmpfile( void );
- Diese Funktion erzeugt eine temporäre Datei, die mit dem Mode "wb+"
geöffnet wurde. Konnte keine Datei geöffnet werden, ist das Ergebnis
NULL.
- int ungetc( int ch, FILE *stream );
- Diese Funktion stellt ein gelesenes Zeichen wieder in den Stream zurück.
Ein erneutes Lesen mittels fgetc( stream) würde wieder dieses Zeichen
lesen.
- int vfprintf( FILE *stream, const char *format, va_list param );
- Diese Funktion ist äquivalent zu fprintf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vfprintf weitergereicht werden.
- int vprintf( const char *format, va_list param );
- Diese Funktion ist äquivalent zu printf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vprintf weitergereicht werden.
- int vsprintf( char *string, const char *format, va_list param );
- Diese Funktion ist äquivalent zu sprintf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vsprintf weitergereicht werden.
- int vfscanf( FILE *stream, const char *format, va_list param );
- Diese Funktion ist äquivalent zu fscanf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vfscanf weitergereicht werden.
- int vscanf( const char *format, va_list param );
- Diese Funktion ist äquivalent zu scanf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vscanf weitergereicht werden.
- int vsscanf( char *string, const char *format, va_list param );
- Diese Funktion ist äquivalent zu sscanf, benutzt aber keine variable
Parameterliste. Der Parameter ist ein Wert, der durch va_start und
vielleicht va_arg initialisiert werden kann. Damit kann eine variable
Parameterliste an vsscanf weitergereicht werden.
- int fileno( FILE *stream );
- Diese Funktion liefert das Handle der Funktion, also unter TOS das
GEMDOS-Dateihandle. Achtung: diese Funktion darf nicht dazu benutzt
werden, unterschiedliche Schichten (Stream, GEMDOS) zu mischen! Dies
würde zu Fehlern führen!
Der nächste Teil beschäftigt sich mit dem Formatstring, mit dessen Hilfe komfortable Ein- und Ausgabe-Operationen (scanf bzw. printf) durchgeführt werden können.
Michael Bernstein |