libri-javascript-python

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_SETinizio del file

SEEK_ENDfine del file

SEEK_CURposizione 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

Indice argomenti linguaggio C

La funzione fopen

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Prodotto tra matrici

Ricerca elementi in una matrice

Quick sort in C

Insertion Sort in C