Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 18 Ein-/Ausgabe-Funktionen
  gp 18.1 Was ist eine Datei?
  gp 18.2 Formatierte und unformatierte Ein-/Ausgabe
  gp 18.3 Streams
  gp 18.4 Höhere Ein-/Ausgabe-Funktionen
  gp 18.5 Datei (Stream) öffnen – fopen
    gp 18.5.1 Modus für fopen()
    gp 18.5.2 Maximale Anzahl geöffneter Dateien – FOPEN_MAX
  gp 18.6 Zeichenweise Lesen und Schreiben – getchar und putchar
    gp 18.6.1 Ein etwas portableres getch()
  gp 18.7 Zeichenweise Lesen und Schreiben – putc/fputc und getc/fgetc
  gp 18.8 Datei (Stream) schließen – fclose
  gp 18.9 Formatiertes Einlesen/Ausgeben von Streams mit fprintf und fscanf
  gp 18.10 Standard-Streams in C
    gp 18.10.1 Standard-Streams umleiten
  gp 18.11 Fehlerbehandlung von Streams – feof, ferror und clearerr
  gp 18.12 Gelesenes Zeichen in die Eingabe zurück-schieben – ungetc
  gp 18.13 (Tastatur-)Puffer leeren – fflush
    gp 18.13.1 Pufferung
  gp 18.14 Stream positionieren – fseek, rewind und ftell
  gp 18.15 Stream positionieren – fsetpos, fgetpos
  gp 18.16 Zeilenweise Ein-/Ausgabe von Streams
    gp 18.16.1 Zeilenweise Lesen mit gets/fgets
    gp 18.16.2 Zeilenweise Schreiben mit puts/fputs
    gp 18.16.3 Zeilenweise Einlesen vom Stream mit getline() (nicht ANSI C)
    gp 18.16.4 Rezepte für zeilenweises Einlesen und Ausgeben
  gp 18.17 Blockweise Lesen und Schreiben – fread und fwrite
    gp 18.17.1 Blockweises Lesen – fread()
    gp 18.17.2 Blockweises Schreiben – fwrite()
    gp 18.17.3 Big-Endian und Little-Endian
  gp 18.18 Datei (Stream) erneut öffnen – freopen
  gp 18.19 Datei löschen oder umbenennen – remove und rename
    gp 18.19.1 remove()
    gp 18.19.2 rename()
  gp 18.20 Pufferung einstellen – setbuf und setvbuf
  gp 18.21 Temporäre Dateien erzeugen – tmpfile und tmpnam
    gp 18.21.1 mkstemp() – Sichere Alternative für Linux/UNIX (nicht ANSI C)
  gp 18.22 Fehlerausgabe mit strerror und perror
  gp 18.23 Formatiert in einem String schreiben und formatiert aus einem String lesen – sscanf und sprintf
  gp 18.24 Fortgeschrittenes Thema
  gp 18.25 Low-Level-Datei-I/O-Funktionen (nicht ANSI C)
  gp 18.26 Datei öffnen – open
  gp 18.27 Datei schließen – close
  gp 18.28 Datei erzeugen – creat
  gp 18.29 Schreiben und Lesen – write und read
  gp 18.30 File-Deskriptor positionieren – lseek
  gp 18.31 File-Deskriptor von einem Stream – fileno
  gp 18.32 Stream von File-Deskriptor – fdopen


Galileo Computing - Zum Seitenanfang

18.22 Fehlerausgabe mit strerror und perror  toptop

Wenn bei einem Systemaufruf ein Fehler auftritt, bekommt die globale Variable errno einen entsprechenden Fehlerwert gesetzt. Mit den beiden Funktionen strerror() und perror() können Sie diese Systemfehlermeldung ausgeben lassen. Die Variable errno ist in der Headerdatei <errno.h> wie folgt deklariert:

extern int errno;

Ebenfalls in dieser Headerdatei <errno.h> sind die Konstanten (Fehlernummern) deklariert, die die Variable errno annehmen kann. Jede dieser Konstanten beginnt mit dem Buchstaben »E«. Diese Fehlernummern sind allerdings, abgesehen von zwei Konstanten, System- und Compiler-abhängig. Folgende zwei Konstanten sind auf allen Systemen gleich:


Tabelle 18.9   Fehlerbehandlungs-Konstanten für mathematische Funktionen

Konstante Bedeutung
EDOM Unzulässiges Argument für eine mathematische Funktion
ERANGE Ergebnis außerhalb des darstellbaren Bereichs

Weitere – allerdings wie schon erwähnt, System- und Compiler-abhängige – Konstanten und ihre Bedeutungen sind:


Tabelle 18.10   Fehlerbehandlungs-Konstanten bei Systemaufrufen

Fehlercode Bedeutung
EZERO Fehler 0
EINVFNC Ungültige Funktionsnummer
ENOFILE Datei nicht gefunden
ENOPATH Pfad nicht gefunden
ECONTR Speicherblöcke zerstört
EINVMEM Ungültige Speicherblockadresse
EINVENV Ungültiges Environment
EINVFMT Ungültiges Format
EINVACC Ungültiger Zugriffscode
EINVDAT Ungültige Daten
EINVDRV Ungültige Laufwerksangabe
ECURDIR Versuch, das aktuelle Verzeichnis zu löschen
ENOTSAM Nicht das gleiche Gerät
ENMFILE Keine weiteren Dateien mehr
ENOENT Datei oder Verzeichnis existiert nicht
EMFILE Zu viele geöffnete Dateien
EACCES Zugriff verweigert
EBADF Ungültiger Datei-Deskriptor
ENOMEM Zu wenig Speicher
ENODEV Gerät existiert nicht
EINVAL Ungültiges Argument
E2BIG Argumentliste ist zu lang
ENOEXEC Fehler beim Exec-Format
EXDEV Kreuzverbindung von Geräten
EFAULT Unbekannter Fehler
EEXIST Datei existiert bereits

Dies dürften jetzt nicht alle gewesen sein bzw. auf anderen Systemen wieder zu viele. Sie sollten in der Headerdatei <errno.h> oder unter Linux auf der man-Page »intro« nachsehen.

Die Variable errno wird bei Programmstart normalerweise auf 0 gesetzt, da es keine Fehlernummer mit dem Wert 0 gibt. Deshalb sollte errno jedes Mal, wenn eine Systemfunktion aufgerufen wird, wieder auf 0 gesetzt werden.

Im ersten Beispiel wird die Funktion perror() verwendet. Zuerst die Syntax zu dieser Funktion:

#include <stdio.h>
void perror(const char *meldung);

Wenn für meldung kein NULL-Zeiger angegeben wurde, wird der String meldung mit anschließendem Doppelpunkt, gefolgt von einer zur errno gehörenden Fehlermeldung, ausgegeben (mit abschließendem '\n'). Rufen Sie hingegen diese Funktion mit dem NULL-Zeiger auf, wird nur eine zur errno gehörende Fehlermeldung ausgegeben. Geschrieben wird diese Fehlermeldung auf die Standardfehlerausgabe (stderr).

/* perror.c */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
   FILE *fp;
   fp = fopen("keinedatei.dat", "r");
   if (NULL == fp) {
      perror("Kann nicht aus Datei lesen ");
      return EXIT_FAILURE;
   }
   return EXIT_SUCCESS;
}

Das Programm versucht, die Datei »keinedatei.dat« zu öffnen. Falls diese nicht existiert, wird eine entsprechende Fehlermeldung ausgegeben:

Kann nicht aus Datei lesen : No such file or directory

Der Funktion perror() kann auch ein NULL-Zeiger übergeben werden:

perror(NULL);

In diesem Fall würde nur das Folgende ausgegeben:

No such file or directory (ENOENT)

Das Gleiche soll jetzt auch mit der Funktion strerror() realisiert werden. Die Syntax der Funktion:

#include <string.h>
char *strerror(int error_nr);

Die Funktion liefert als Rückgabewert einen Zeiger auf einen String, welcher zur Systemfehlermeldung der Variablen errno passt. Der Parameter error_nr beinhaltet in der Regel die Fehlervariable von errno.

/* strerror.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
int main(void) {
   FILE *fp;
   fp = fopen("keinedatei.dat", "r");
   if (NULL == fp) {
      fprintf(stderr, "%s\n", strerror(errno));
      return EXIT_FAILURE;
   }
   return EXIT_SUCCESS;
}

Das Programm läuft genauso ab wie das Programm zuvor mit perror().

Mit dem nun folgenden Programm wird eine Datei mit dem Namen »testfile« erstellt. Zuerst soll die Datei zum Lesen geöffnet werden. Anschließend wird überprüft

if(errno == ENOENT)

ob die Variable errno den Wert der Konstante ENOENT hat. Wenn ja, bedeutet dies, dass keine solche Datei existiert, und sie soll somit neu angelegt werden. Sollte es Probleme beim Anlegen dieser Datei geben, so wird dies mit dem nächsten perror()-Aufruf ausgegeben.

/* isfile.c */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define ESUCCESS 0
int main(void) {
   FILE *fp;
   fp = fopen("testfile", "r");
   if(errno == ENOENT) {
      /* errno wieder zurücksetzen */
      errno = ESUCCESS;
      fp = fopen ("testfile", "w");
      if(NULL == fp) {
         perror(NULL);
         return EXIT_FAILURE;
      }
      else
         printf("Datei \"testfile\" angelegt\n");
   }
   else
      printf("Datei \"testfile\" exisitiert bereits\n");
   fclose(fp);
   return EXIT_SUCCESS;
}
 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de