Funzione fseek per spostare il file pointer di un file in C

La funzione fseek in C è una funzione in grado di spostare il puntatore di posizione del file, chiamato file pointer, in una qualsiasi posizione all’interno del file. In particolare la funzione fseek permette di definire un offset da utilizzare insieme a delle costanti che indicano particolari zone del file. Di seguito viene riportata la sintassi di fseek:



int fseek(FILE *fp, long int offset, int pos);


dove fp è il puntatore al file (restituito dalla funzione fopen) in cui vogliamo spostare la posizione del file pointer, offset indica il numero di quanti byte il file pointer verrà spostato dalla posizione pos, mentre pos è la posizione iniziale, definita da una di tre costanti, a cui verrà aggiunta l’offset. Le tre costanti utilizzabili per indicare la posizione iniziale pos, sono le seguenti:

  • SEEK_SET: indica l’inizio del file
  • SEEK_CUR: indica la posizione attuale del file pointer
  • SEEK_END: indica la fine del file

Quindi la combinazione dell’offset e delle costanti di posizioni, permettono di spostare il file pointer in qualsiasi posizione all’interno del file, indipendentemente dalla sua posizione attuale. Oltre ad un accesso sequenziale, la funzione fseek permette anche di accedere in maniera casuale all’interno di un file.

Nota: il valore dell’offset non deve essere per forza positivo, ma può assumere anche valori negativi.

La funzione fseek restituisce un valore di tipo intero, nello specifico 0 in caso di successo, mentre un qualsiasi altro valore diverso da 0 sta ad indicare un errore durante lo spostamento.

Esempio di utilizzo della funzione fseek in C

Di seguito viene riportato l’esempio visto nella pagina della funzione fread, in cui viene scritta una stringa su un file, precedentemente aperto, ma dato che l’operazione di scrittura sposta il file pointer, dobbiamo spostare quest’ultimo in modo da poter leggere il contenuto del file. Per poter spostare il file pointer facciamo uso della funzione fseek, che ci permette di spostare la posizione del puntatore non solo all’inizio, come con la funzione rewind, ma anche con un certo offset.



#include <stdio.h>
#include <string.h>

int main(){
    char str[] = "Ciao mondo";
    char buffer[100];
    FILE* fp;
    
    fp = fopen("test.txt", "w+");
    
    if(fp == NULL){
        printf("Errore durante l'apertura del file!\n");
    } else {
        // Scriviamo sul file il contenuto di str
        fprintf(fp, "%s", str);
        // Resettiamo il file pointer all'inizio del file
        fseek(fp, 0, SEEK_SET);
        // Leggiamo il contenuto del file	
        fread(buffer, 1, strlen(str), fp);  
        
        printf("Contenuto file: %s", buffer);
    }
    
    fclose(fp);

    return 0;
}


Contenuto file: Ciao mondo

In questo modo otteniamo lo stesso risultato ottenuto usando la funzione rewind, ma volendo possiamo definire un offset diverso da 0 per spostare il file pointer ed ottenere un risultato diverso. Ad esempio usando un offset da 6 byte partendo sempre da SEEK_SET otteniamo:
Contenuto file: ondo

Indice pagine linguaggio C: