zurück zum News-Archiv
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

Anfang zurück vorwärts Ende Seitenanfang

Copyright und alle Rechte beim ATOS-Magazin. Nachdruck und Veröffentlichung von Inhalten nur mit schriftlicher Zustimmung der Redaktion.
Impressum - Rückmeldung via Mail oder Formular - Nachricht an webmaster