ein Kapitel zurück                                           ein Kapitel weiter

Zu erst gleich mal den Syntax von fseek...

int fseek(FILE *datei, long offset, int origin);

Mit fseek können sie den Zeiger der Datei datei beliebig positionieren. Die Positionierung geben sie mittels offset und origin an. origin gibt den Bezugspunkt an von wo der Dateizeiger datei verschoben werden soll und offset gibt wie weit von diesem Bezugspunkt aus der Dateizeiger gesetzt werden soll. Für origin sind 3 symbolische Konstanten definiert...

Symbol Wert Offsetberechnung ab
SEEK_SET 0 Anfang der Datei
SEEK_CUR 1 aktuelle Position d. Satzzeigers
SEEK_END 2 Ende der Datei


Hierzu nun wieder ein kleines Beispiel wie fseek funktioniert....

/*Download:fseek.c*/
#include <stdio.h> #include <stdlib.h> int main() { FILE *quelle,*fehler; int c,ausw; char datei[20]; long pos=0; printf("Welche Datei wollen sie oeffnen : "); scanf("%s",datei); fflush(stdin); if((quelle=fopen(datei,"a+")) == NULL) { if((fehler=fopen("fehler.log","a+")) != NULL) { fprintf(fehler,"Datei %s ließ sich nicht oeffnen\n",datei); fprintf(stderr,"Konnte %s nicht oeffnen\n",datei); exit(0); } fprintf(stderr,"Konnte %s nicht oeffnen\n",datei); exit(1); } /*Das Zeichen '*' soll das Ende unsere Eingabe markieren*/ printf("Eingabe machen und mit '*' beenden\n"); while((c=getc(stdin)) != '*') putc(c,quelle); /*Wir setzen den Zeiger quelle an den Anfang der Datei*/ fseek(quelle, 0L, SEEK_SET); /*Wir geben die ganze Datei auf dem Bildschirm aus*/ printf("\nAusgabe der kompletten Datei : \n"); while((c=getc(quelle)) != EOF) putc(c,stdout); /*Zur Demonstration gehen wir von der aktuellen Position*/ /*10 Zeichen zurück und geben die letzten 10 Zeichen aus*/ printf("\nDie letzten 10 Zeichen : "); fseek(quelle, -10L, SEEK_CUR); while((c=getc(quelle)) != EOF) putc(c,stdout); /*Wir legen selbst fest wie viel Zeichen wir vom Start aus*/ /*einrücken wollen.*/ printf("\nWieviele Stellen vom Start aus wollen sie einrücken : "); scanf("%ld",&pos); fflush(stdin); fseek(quelle, 0L, SEEK_SET); fseek(quelle, pos,SEEK_CUR); printf("-1- Lesen\n"); printf("-2- Schreiben\n"); printf("\nAuswahl: "); scanf("%d",&ausw); fflush(stdin); if(ausw==1) { while((c=getc(quelle)) != EOF) putc(c,stdout); } /*Wird trotzdem immer ans Ende geschrieben wegen dem Modus a+*/ else if(ausw==2) { while((c=getc(stdin)) != '*') putc(c,quelle); } else fprintf(stderr,"Falsche Eingabe!!\n"); return 0; }

Dies Programm dient nur zu Demonstration von fseek. Zuerst öffnen wir wieder wie gewohnt eine Datei. Falls es nicht gelingt wird eine Datei mit dem Namen "fehler.log" beschrieben. Falls dies auch nicht gelingt gibt es halt nur eine Meldung auf dem Bildschirm. Zuerst machen sie so lange eine Eingabe bis sie das Zeichen '*' eingeben. Die wird an die Datei falls vorhanden ans Ende gehängt oder falls nicht vorhanden erzeugt ("a+" - Modus). Dann setzten wir mittels...

fseek(quelle, 0L, SEEK_SET);

...denn FILE - Zeiger quelle an den Anfang der Datei, da SEEK_SET ja als Anfang der Datei definiert ist. Wenn sie jetzt z.B. anstatt dieser eben gezeigten fseek - Eingabe......

fseek(quelle, 10L, SEEK_SET);

...diese Eingabe gemacht hätten, wäre unser FILE - Zeiger um 10 Bytes vom Anfang der Datei nach vorne gerückt. Also 10 Zeichen vom Dateianfang entfernt. Anschließend wird die ganze Datei auf dem Bildschirm ausgegeben. Nun zeigt unser FILE - Zeiger auf das Ende der Datei. Nun wollen wir mittels....

fseek(quelle, -10L, SEEK_CUR);

...den FILE - Zeiger quelle um -10 Stellen von der aktuellen Position (SEEK_CUR) verschieben. Sie sehen das es auch möglich ist negative Werte für offset anzugeben. Also geben wir hier die 10 letzten Zeichen auf dem Bildschirm aus. Anschließend wollen wir das Programm interaktiver machen und eine Abfrage machen um wie viele Stellen wir unseren FILE - Zeiger quelle vom Anfang der Datei verschieben wollen. Anschließend setzen wir wieder mit fseek unseren FILE - Zeiger an dem Anfang der Datei um anschließend die von uns gewünschte Anzahl von Zeichen nach vorne zu rücken mittels...

fseek(quelle, pos,SEEK_CUR);

Anschließend folgt noch eine Abfrage ob sie von der Stelle, wie viel sie den FILE - Zeiger nach vorne haben wollten, lesen oder schreiben wollen. Schreiben funktioniert bei diesem Programm nicht da wir unser Programm ja im Modus a+ geöffnet haben. Die Datei wird somit immer ans Ende der Datei gehängt. Aber das ist jetzt hier nicht so wichtig. Es geht hier lediglich um die Funktion fseek. Ganz so sicher ist dies Programm aber auch nicht, den was machen sie wenn folgende Eingabe machen...

fseek(quelle, -10L, SEEK_SET);

Das würde heißen das sie vom Dateianfang aus um 10 Position den FILE - Zeiger nach hinten versetzten. Also außerhalb der Datei irgendwohin. Wenn sie daraus nur lesen ist es weniger schlimm. Aber wenn sie in diesem Bereich schreiben können ganz schön was anrichten. Für so ein Beispiel gibt es die Funktion....

long ftell(FILE *datei);

Mit ftell können sie die Aktuelle Position ihres FILE - Zeigers testen. Falls dabei ein Fehler auftritt liefert die Funktion -1L zurück. Also einen Wert kleiner als 0. Hier nun das Beispiel dazu....

/*Download:fseek2.c*/
#include <stdio.h> #include <stdlib.h> int main() { FILE *quelle; int c; char datei[20]; printf("Welche Datei wollen sie oeffnen : "); scanf("%s",datei); fflush(stdin); if((quelle=fopen(datei,"a+")) == NULL) { fprintf(stderr,"Konnte %s nicht oeffnen\n",datei); exit(1); } printf("Eingabe machen und mit '*' beenden\n"); while((c=getc(stdin)) != '*') putc(c,quelle); /*Wir machen mit Absicht einen Fehler*/ fseek(quelle, -10L, SEEK_SET); if((ftell(quelle)) <0) { fprintf(stderr,"Achtung schwerer Fehler,\n"); fprintf(stderr,"FILE - Zeiger zeigt auf einen\n"); fprintf(stderr,"undefinierten Bereich!\n"); exit (2); } return 0; }

Wir haben bei diesem Programm mittels...

fseek(quelle, -10L, SEEK_SET);

...unseren FILE - Zeiger auf einem undefinierten Speicherbereich gesetzt. Dies überprüfen wir mittels...

if((ftell(quelle)) <0)

Wir testen ob die if - Abrage von ftell einen Wert kleiner als 0 zurückgibt. Wenn ja, ist in diesem Programm der Fall, wird die Fehlermeldung ausgegeben und das Programm abgebrochen. Sie sollten sich allgemein Angewöhnen in Programmen die sie schreiben möglichst viele Überprüfungen vorzunehmen. Außerdem können sie ftell ja auch noch anders einsetzten. Da ftell ja die Dateizeigerposition zurückliefert können sie auch prüfen wie groß eine Datei ist...

/*Download:fseek3.c*/
#include <stdio.h> #include <stdlib.h> int main() { FILE *quelle; int c; char datei[20]; printf("Welche Datei wollen sie oeffnen : "); scanf("%s",datei); fflush(stdin); if((quelle=fopen(datei,"r")) == NULL) { fprintf(stderr,"Konnte %s nicht oeffnen\n",datei); exit(1); } /*Wir setzten den FILE - Zeiger ans Ende der Datei*/ fseek(quelle, 0L, SEEK_END); printf("Das Programm ist %ld Bytes gross!!\n",ftell(quelle)); return 0; }

Mit fseek haben wir den FILE - Zeiger ans Ende der Datei gesetzt. Mit ftell fragen wir die aktuelle Position des FILE - Zeigers ab. Somit haben wir praktisch die Speichergröße der Datei.

Wenn sie den FILE - Zeiger an den Anfang der Datei setzten wollen können das anstatt wie bisher mit...

fseek(quelle, 0L, SEEK_SET);

...auch mit...

rewind(quelle);

...machen. Beide Funktionen erfüllen den selben Zweck. Der Syntax von rewind lautet...

void rewind(FILE *datei);

Ich glaube diese Funktion bedarf eigentlich keiner Erklärung mehr. Wenn sie wollen könne sie rewind ja in dem 1. Programm dieses Kapitels testen. Einfach alle...

fseek(quelle, 0L, SEEK_SET);

...ersetzen durch...

rewind(quelle);

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf