La funzione fseek in C consente di muovere il puntatore di lettura e/o scrittura in una posizione qualunque all’interno del file, dopo la sua apertura con fopen.
Finora l’accesso al file è stato di tipo sequenziale, ovvero per aggiungere o leggere un elemento ci siamo posizionati esattamente sotto tutti gli elementi precedenti.
Infatti, molte volte c’è la necessità di realizzare un accesso diretto o random ad un elemento di un file. Ecco dunque che la funzione fseek ritorna molto utile a questo scopo.
La sintassi della funzione fseek in C è quindi la seguente:
int fseek(FILE *fp, long distanza, int partenza)
Dove fp è il file pointer, distanza indica di quanti byte il file pointer deve essere spostato mentre partenza indica da quale posizione deve essere spostato.
La funzione fseek ritorna 0 se lo spostamento è avvenuto con successo, altrimenti un valore diverso da 0.
Allora definiamo il punto di partenza che può assumere solo uno di questi tre valori:
SEEK_SET – inizio del file
SEEK_END – fine del file
SEEK_CUR – posizione corrente dell’indicatore
Esempio d’uso della funzione fseek in C
Realizziamo dunque lo stesso esempio di prima con rewind con la funzione fseek in C, solo a scopo didattico per capirne il funzionamento.
#include<stdlib.h>
#include<stdio.h>
#define N 100
int main() {
FILE *fp;
char buf[N];
if((fp=fopen("alunni.txt", "rt"))==NULL) {
printf("Errore nell'apertura del file'");
exit(1);
}
/* legge e stampa fino alla fine del file */
while(!feof(fp)) {
fgets(buf,N,fp);
printf("%s", buf);
}
/* riporta il file pointer all'inizio */
fseek(fp,0,SEEK_SET);
printf("\nStampo la seconda volta\n");
/* legge e stampa fino alla fine del file */
while(!feof(fp)) {
fgets(buf,N, fp);
printf("%s", buf);
}
printf("\nStampo la terza volta\n");
fseek(fp,0,SEEK_CUR);
/* legge e stampa fino dalla posizione corrente dell'indicatore che in questo caso è l'ultima riga*/
while(!feof(fp)) {
fgets(buf,N, fp);
printf("%s", buf);
}
fclose(fp);
return 0;
}
Le potenzialità della funzione fseek in C saranno trattate anche nelle prossime lezioni in maniera approfondita.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna
Ricerca elementi in una matrice