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

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 16 Ein-/Ausgabe-Funktionen
Pfeil 16.1 Was ist eine Datei?
Pfeil 16.2 Formatierte und unformatierte Ein-/Ausgabe
Pfeil 16.3 Standard-Streams
Pfeil 16.4 Höhere Ein-/Ausgabe-Funktionen
Pfeil 16.5 Datei (Stream) öffnen – »fopen«
Pfeil 16.5.1 Modus für »fopen()«
Pfeil 16.5.2 Maximale Anzahl geöffneter Dateien – »FOPEN_MAX«
Pfeil 16.6 Zeichenweise lesen und schreiben – »getchar()« und »putchar()«
Pfeil 16.6.1 Ein etwas portableres »getch()«
Pfeil 16.7 Zeichenweise lesen und schreiben – »putc()«/»fputc()« und »getc()«/»fgetc()«
Pfeil 16.8 Datei (Stream) schließen – »fclose()«
Pfeil 16.9 Formatiertes Einlesen/Ausgeben von Streams mit »fprintf()« und »fscanf()«
Pfeil 16.10 Standard-Streams in C
Pfeil 16.10.1 Standard-Streams umleiten
Pfeil 16.11 Fehlerbehandlung von Streams – »feof()«, »ferror()« und »clearerr()«
Pfeil 16.12 Gelesenes Zeichen in die Eingabe zurückschieben – »ungetc()«
Pfeil 16.13 (Tastatur-)Puffer leeren – »fflush()«
Pfeil 16.14 Stream positionieren – »fseek()«, »rewind()« und »ftell()«
Pfeil 16.15 Stream positionieren – »fsetpos()«, »fgetpos()«
Pfeil 16.16 Zeilenweise Ein-/Ausgabe von Streams
Pfeil 16.16.1 Zeilenweise lesen mit »gets()«/»fgets()«
Pfeil 16.16.2 Zeilenweise schreiben mit »puts()«/»fputs()«
Pfeil 16.16.3 Zeilenweise vom Stream einlesen mit »getline()« (nicht ANSI C)
Pfeil 16.16.4 Rezepte für zeilenweises Einlesen und Ausgeben
Pfeil 16.17 Blockweise lesen und schreiben – »fread()« und »fwrite()«
Pfeil 16.17.1 Blockweise lesen – »fread()«
Pfeil 16.17.2 Blockweise schreiben – »fwrite()«
Pfeil 16.17.3 Big Endian und Little Endian
Pfeil 16.18 Datei (Stream) erneut öffnen – »freopen()«
Pfeil 16.19 Datei löschen oder umbenennen – »remove()« und »rename()«
Pfeil 16.19.1 remove()
Pfeil 16.19.2 rename()
Pfeil 16.20 Pufferung einstellen – »setbuf()« und »setvbuf()«
Pfeil 16.20.1 Die Funktion »setbuf()«
Pfeil 16.20.2 Die Funktion »setvbuf()«
Pfeil 16.21 Temporäre Dateien erzeugen – »tmpfile()« und »tmpnam()«
Pfeil 16.21.1 »mkstemp()« – sichere Alternative für Linux/UNIX (nicht ANSI C)
Pfeil 16.22 Fehlerbehandlung
Pfeil 16.22.1 Fehlerausgabe mit »perror()«
Pfeil 16.22.2 Fehlerausgabe mit »strerror()«
Pfeil 16.23 Formatiert in einen String schreiben und formatiert aus einem String lesen – »sscanf()« und »sprintf()«
Pfeil 16.24 Byte- und wide-orientierter Stream
Pfeil 16.25 Ein fortgeschrittenes Thema
Pfeil 16.26 Low-Level-Datei-I/O-Funktionen (nicht ANSI C)
Pfeil 16.26.1 Datei öffnen – »open()«
Pfeil 16.26.2 Datei schließen – »close()«
Pfeil 16.26.3 Datei erzeugen – »creat()«
Pfeil 16.26.4 Schreiben und Lesen – »write()« und »read()«
Pfeil 16.26.5 File-Deskriptor positionieren – »lseek()«
Pfeil 16.26.6 File-Deskriptor von einem Stream – »fileno()«
Pfeil 16.26.7 Stream von File-Deskriptor – »fdopen()«


Rheinwerk Computing - Zum Seitenanfang

16.22 Fehlerbehandlung Zur nächsten ÜberschriftZur vorigen Überschrift

Wenn bei einem Systemaufruf ein Fehler auftritt, wird in der globalen Variable errno ein entsprechender 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> definiert.

Dabei ist es nicht vorgeschrieben, ob errno eine globale Variable (vom Typ int) oder ein Makro ist, das einen modifizierbaren L-Wert vom Typ int hat.

Ebenfalls in der Headerdatei <errno.h> sind die Konstanten (Fehlernummern) deklariert, die die Variable errno annehmen kann. Jede dieser Konstanten beginnt mit dem Großbuchstaben »E«. Diese Fehlernummern sind allerdings, abgesehen von drei Konstanten, system- und compiler-abhängig. Tabelle 16.9 enthält die drei Konstanten, die auf allen Systemen gleich und vorhanden sind.


Tabelle 16.9 Fehlerbehandlungskonstanten für mathematische Funktionen

Konstante Bedeutung
EDOM

(Domain error) unzulässiges Argument für eine mathematische Funktion

EILSEQ

(Illegal sequence) Bei einer Verarbeitung von Multibyte-Zeichen wurden Bytes entdeckt, die keine gültigen Zeichen darstellen.

ERANGE

(Range error) Das Ergebnis liegt außerhalb des darstellbaren Bereichs.


Weitere – allerdings wie schon erwähnt, system- und compiler-abhängige – Konstanten und ihre Bedeutungen sind in Tabelle 16.10 aufgeführt.


Tabelle 16.10 Fehlerbehandlungskonstanten 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 Manpage intro nachsehen.

Die Variable errno wird beim 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.


Rheinwerk Computing - Zum Seitenanfang

16.22.1 Fehlerausgabe mit »perror()« Zur nächsten ÜberschriftZur vorigen Überschrift

Im ersten Beispiel wird die Funktion perror() verwendet. Sehen sie sich zuerst die Syntax zu dieser Funktion an:

#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 zu errno gehörenden Fehlermeldung, ausgegeben (mit abschließendem '\n'). Rufen Sie hingegen diese Funktion mit dem NULL-Zeiger auf, wird nur eine zu 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)

Rheinwerk Computing - Zum Seitenanfang

16.22.2 Fehlerausgabe mit »strerror()« topZur vorigen Überschrift

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

#include <string.h>

char *strerror(int error_nr);

Die Funktion liefert als Rückgabewert einen Zeiger auf einen String, der 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 mit

if(errno == ENOENT)

überprüft, 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;
}


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: C/C++






 C/C++


Zum Rheinwerk-Shop: Einstieg in C






 Einstieg in C


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern