Wenn der Hauptspeicher nicht
ausreicht
UNIX: Gemeinsame Schnittstelle für alle angeschlossenen Geräte.
2 Möglichkeiten
Buffered (high level) Unbuffered (low level)
Stream: Gepufferte Schnittstelle
für Datenaustausch zwischen
Zusammenhängende Folge von Bytes
Textdatei ist ein Stream, dessen Bytefolge als ASCII-Codes
interpretiert wird
Binärdatei ist eine Bytefolge, die
Computer-interne Datendarstellung
Die FILE -Struktur (stdio.h)
#define MAX_FILE_NUM 20 typedef struct {
int level;
unsigned int flags;
char path;
unsigned char hold;
int bsize;
unsigned char *buffer;
unsigned char *nextc;
FILE *stdin = _iob[0]
ist die Standard Eingabedatei, die Daten von der Tastatur bekommt
FILE *stdout = _iob[1]
ist die
Standard Ausgabedatei, die Daten auf den Bildschirm ausgibt
wird für
Zur Verfügung stellen:
fopen(),fclose(), fflush(), setbuf(),
usw.
Lesen und Schreiben:
fprintf(), fputc(), fscanf(), fgetc(),usw.
Positionierung:
fgetpos(), fsetpos(), fseek(), ftell(), rewind(),usw. Für
Direktzugriff
FILE *fopen(char *Dateiname, char *mode);
Rückgabewert: Zeiger auf
FILEoder
NULL mode
:
"r"
heißt read (lesen)
"w"
heißt write (schreiben)
"a"
heißt append (am Ende schreiben)
int fclose(FILE *fp);
Entleert Dateipuffer und löst alle Verbindungen zur Datei
Rückgabewert:
0bei Erfolg,
EOFbei
Mißerfolg
int fscanf(FILE *fp, char *format, arg1, ..., argn);
Liest von
*fpunter Steuerung von
formatund schreibt die umgewandelten Werte an die Adressen
arg1, ..., argnEOF
! "
int fgetc(FILE *fp);
holt das nächste Zeichen aus dem Puffer.
Rückgabewert: ASCII-Wert oder
EOF
int fprintf(FILE *fp, char *format, arg1, ... , argn);
Schreibt auf
*fpdie unter Steuerung von
formatumgewandelten Argumente
arg1, ... , argnRückgabewert: Anzahl der geschriebenen
Zeichen oder
EOF! "
int fputc(int ch, FILE *fp);
ch *fp
ch EOF
#
int feof(FILE *fp);
Rückgabewert: positive int , falls
Ende der Datei erreicht worden ist
int fflush(FILE *fp);
char *fgets(char * wo, int wieviel, FILE
*fp);
int fputs(const char *was, FILE *fp);
int ungetc(int c, FILE *fp);
$
Beim Kopieren kleine Buchstaben in Großbuchstaben umwandeln
kopieren <Ausgangsdatei> <Zieldatei>
!
% &
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int c;
FILE *input_file, *output_file;
if (argc < 3){
fprintf(stderr, "Verwendung: %s <eingabe>, <ausgabe>,
*argv); exit(1);}
if ((input_file = fopen(*++argv, "r")) == NULL){
fprintf(stderr, "\n%s kann nicht geöffnet werden",
*argv); exit(1);}
if ((output_file = fopen(*++argv, "w")) == NULL){
fprintf(stderr, "\n%s kann nicht angelegt werden",
' & ! ( &
"
while ((c = fgetc(input_file)) != EOF) if ('a' <= c && c <= 'z')
fputc(c + 'A' - 'a', output_file);
else
fputc(c, output_file);
fclose(input_file);
fclose(output_file);
return 0;
}
) *
Bisher wurden Dateien sequentiell verarbeitet
Direktzugriff heißt "Direkt zum Datensatz springen"
Offsets müssen angegeben werden
Für Binärdateien geeignet
+,
positionieren Dateicursor.
rewind()
am Anfang der Datei
lseek()
und
fseek() offsetbytes bzgl
baseoffset
! " # $
void rewind (FILE *fp);
long lseek(FILE *fp, long offset, int base);
int fseek(FILE *fp, long offset, int base);
base - " "
base = SEEK_SET
heißt vom Anfang der Stream
base = SEEK_CUR
heißt von aktuellen Dateiposition aus
base = SEEK_END
heißt vom Ende der
Stream
$
fseek (fp, 0l, SEEK_SET);
bedeutet:
zum Anfang der Datei springen (wie
rewind()&
fseek (fp, -100l, SEEK_CUR);
' % % ( $
$
Es ist zulässig, die Dateiposition hinter den Stromende zu setzen Es ist nicht zulässig, die
Dateiposition vor Datenanfang zu
setzen
Lesen:
Schreiben
int fread(void *ptr, int size, int nobj, FILE *fp);
) $
nobj* + ,
size *ptrint fwrite(void *ptr, int size, int nobj, FILE *fp);
$
#include <stdio.h>
typedef struct{
int KontoNr;
char Name[25];
float KontoStand;
} t_Kunde;
int main() {
FILE *fp;
t_Kunde Kunde = {0, "", 0.0};
if ((fp = fopen("kunden.dat", "r+")) != NULL){
printf("Kontonr. bitte eingeben\n: ");
$ # )
while (Kunde.KontoNr != 0){
printf("Name und Kontostand bitte eintragen: ");
fscanf(stdin, "%s%f", Kunde.Name, &Kunde.KontoStand);
fseek(fp, (Kunde.KontoNr - 1)*sizeof(t_Kunde), SEEK_SET);
fwrite(&Kunde, sizeof(t_Kunde), 1, fp);
printf("Kontonummer bitte eintragen: ");
scanf("%d", &Kunde.KontoNr);
}
fclose(fp);
$
int main(){
FILE *fp;
t_Kunde Kunde = {0, "", 0.0};
if ((fp = fopen("kunden.dat", "r")) == NULL){
fprintf(stderr, "Datei existiert nicht");
exit(0);}
printf("%-7s%-25s%9s\n","Kontonr", "Name",
"Kontostand");
while(!feof(fptr)){
fread(&Kunde, sizeof(t_Kunde), 1, fp);
if (Kunde.KontoNr != 0)
printf("%-7s%-25s%-9s\n", Kunde.KontoNr, Kunde.Name, Kunde.KontoStand);