16.15 Stream positionieren – »fsetpos()«, »fgetpos()« 

Neben den Funktionen fseek() und ftell() gibt es noch eine weitere Möglichkeit zum Positionieren eines Schreib-/Lesezeigers. Wobei diese beiden Funktionen häufig gar nicht mehr erwähnt werden, da sie nicht mehr bieten als fseek() und ftell(). Die Syntax der beiden Funktionen sieht so aus:
#include <stdio.h> int fsetpos(FILE *datei, const fpos_t *pos); int fgetpos(FILE *datei, fpos_t *pos);
Mit fsetpos() wird der Schreib-/Lesezeiger auf die Adresse von pos gesetzt. Die »Variable« fpos_t ist ein sogenannter primitiver Datentyp. Die Adresse, die für pos verwendet wird, sollte mit dem Aufruf der Funktion fgetpos() ermittelt werden. Hierzu ein Beispiel:
/* fpos.c */ #include <stdio.h> #include <stdlib.h> int main(void) { FILE *quelle; int c; char datei[20]; fpos_t pos; printf("Welche Datei wollen Sie oeffnen : "); scanf("%s",datei); if( (quelle=fopen(datei,"r")) == NULL) { fprintf(stderr, "Konnte %s nicht oeffnen!!\n", datei); return EXIT_FAILURE; } /* Wir lesen die aktuelle Position unseres FILE-Zeigers. */ fgetpos(quelle,&pos); printf("Der Positionszeiger zeigt auf Byte : %ld\n",pos); while( (c=getc(quelle)) != EOF) putc(c,stdout); printf("Groesse der Datei= Byte : %ld\n", ftell(quelle)); /* Wir setzen den FILE-Zeiger wieder an den Anfang der Datei. */ fsetpos(quelle,&pos); printf("Wir sind wieder an Position %ld\n",pos); return EXIT_SUCCESS; }
Nachdem eine Datei zum Lesen geöffnet wurde, wird mit
fgetpos(quelle,&pos);
die aktuelle Position des FILE-Zeigers quelle ermittelt. Die Position steht anschließend in dem zu Beginn des Programms festgelegten Datentyp:
fpos_t pos;
Die Adresse wird mit dem Adressoperator (&) in der Funktion fgetpos() an pos übergeben. Danach wird die Datei ausgelesen, mitsamt der Größe in Byte. Mit
fsetpos(quelle,&pos);
wird der Stream-Zeiger wieder an den Dateianfang gesetzt. Dies hätten Sie auch mit folgender Funktion erreichen können:
rewind(quelle);
Richtig eingesetzt sind diese beiden Funktionen recht nützlich, falls eine bestimmte Position in der Datei gespeichert wird, um später wieder zu ihr zurückzuspringen.