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.13 (Tastatur-)Puffer leeren – fflush  downtop

Diese Funktion dürfte Ihnen aus Kapitel 5, Formatierte Eingabe mit scanf(), bekannt vorkommen, als es darum ging, ein im Tastaturpuffer befindliches Zeichen wie '\n' (Newline-Zeichen) zu entfernen. Die Syntax von fflush():

#include <stdio.h>
int fflush(FILE *datei);

Mit fflush() werden alle Inhalte von einem noch nicht geleerten Puffer eines Streams übertragen, die dem FILE-Zeiger datei zugeordnet sind (oder auch Standard-Streams). Das heißt kurz und bündig, die dem Stream zugeordneten Puffer werden geleert. Falls die Datei zum Schreiben geöffnet ist, werden die sich noch im Puffer befindlichen Zeichen physikalisch in die Datei geschrieben. War eine Datei zum Lesen geöffnet, werden die noch nicht gelesenen Zeichen im Eingabepuffer gelöscht. fflush() gibt bei Erfolg 0 zurück, andernfalls EOF.

Es scheint aber nicht ganz klar, ob dies auch für Linux gültig ist – wie Sie dies auch auf der man-Page zu fflush() nachlesen können. Auf Linux-Systemen will fflush() partout nicht funktionieren. Nehmen Sie etwa folgendes Programm:

/* fflush.c */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
   char x,y;
   printf("Bitte einen Buchstaben eingeben : ");
   scanf("%c",&x);
   fflush(stdin);
   printf("Bitte noch einen Buchstaben eingeben : ");
   scanf("%c",&y);
   printf("Sie gaben ein %c und %c \n",x,y);
   return EXIT_SUCCESS;
}

Sie können das Programm verbiegen und verdrehen wie Sie wollen, immer wird die zweite Ausgabe durch das sich im Puffer befindliche '\n'-Zeichen überdrückt. In Kapitel 5 finden Sie Beispiele, wie das Problem gelöst werden kann.

Der ANSI C-Standard schreibt aber auch nicht vor, wie die Funktion fflush() auf den Stream stdin zu reagieren hat. Das Verhalten ist somit nicht definiert und kann funktionieren oder auch nicht.


Galileo Computing - Zum Seitenanfang

18.13.1 Pufferung  toptop

Eine kurze Erklärung zur Pufferung: Die Standardeinstellung ist bei ANSI C Compilern die Vollpufferung. Dies ist auch sinnvoller und schneller als keine Pufferung, da wenige Lese- und Schreiboperationen etwa auf der Festplatte, der Diskette oder dem Arbeitsspeicher stattfinden. Die Puffergröße ist abhängig vom Compiler, liegt aber meistens bei 512 und 4096 Bytes. Die Größe ist in der Headerdatei <stdio.h> mit der Konstante BUFSIZ angegeben.

Bei einer Pufferung, die zeichenweise eingestellt ist, würde ein Kopiervorgang zum Beispiel so ablaufen:

Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
usw. Zeichen für Zeichen

Bei einer Datei mit 100 Bytes wären das 100 Zugriffe zum Lesen von der Tastatur im Wechsel mit 100 Zugriffen zum Schreiben auf die Diskette.

Bei Vollpufferung läuft dies so: Es wird so lange gelesen, bis der Puffer voll ist (BUFSIZE), und dann wird geschrieben. Im obigen Beispiel würde bei Vollpufferung einmal gelesen und einmal geschrieben.

 << 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