Funzione fgets per leggere stringhe da file in C

Una volta aperto un file in C con la funzione fopen, è possibile usare la funzione fgets per leggere una riga da uno specificato stream e memorizzarla all’interno di una variabile specificata. Di seguito viene riportata la sintassi della funzione fgets:

char fgets(char str, int n, FILE *fp)

dove str è il puntatore ad un array di chars in cui verrà memorizzata la stringa letta, n è il numero massimo di caratteri da leggere che tipicamente è uguale alla lunghezza dell’array di chars (in modo da evitare possibili buffer overflow), mentre fp è il puntatore al file aperto ottenuto dalla funzione fopen.

La funzione fgets permette di leggere al massimo n-1 caratteri, oppure se durante l’operazione di lettura viene incontrato il carattere newline o viene raggiunto l’end of file (EOF) viene terminata l’esecuzione della funzione fgets.

Al termine dell’esecuzione la funzione fgets restituisce, in caso di successo, il parametro str, mentre viene ritornato il valore NULL se viene raggiunto l’EOF senza aver letto alcun carattere.

Nota: all’interno degli n caratteri è incluso anche il carattere nullo '\0' che serve per indicare la fine della stringa.

Esempio di lettura di n caratteri con fgets

Nel seguente esempio useremo la funzione fgets per leggere n caratteri da un file che contiene il seguente testo: "Ciao mondo!". 

Innanzitutto dobbiamo aprire il file con la funzione fopen e verificare che il puntatore non sia NULL. Per utilizzare la fgets abbiamo bisogno di 3 parametri, il primo è il puntatore all’array di chars in cui memorizzare il contenuto letto dalla funzione, il secondo indica il numero massimo di caratteri da leggere, infine il terzo è il puntatore al file che abbiamo già ottenuto dalla fopen. 

Per quanto riguarda l’array di chars, dobbiamo definire la dimensione dell’array a priori, risulta quindi vantaggioso definire una costante (nel nostro caso MAX) che indica la lunghezza dell’array e verrà usato come secondo parametro della funzione fgets, in questo modo siamo sicuri di evitare problemi di buffer overflow.

A questo punto non rimane che chiamare la funzione fgets, inserire come parametri l’array di chars, la costante e il puntatore al file, e infine stampare a schermo il contenuto della stringa con la funzione printf.

#include <stdio.h> #define MAX 9 void main(){     char s[MAX];     FILE *fptr;     fptr = fopen("test.txt", "r");     if(fptr == NULL){         printf("Errore durante l'apertura del file!\n");     } else {         fgets(s, MAX, fptr);         printf("%s", s);     }     fclose(fptr); }   // Output: Ciao mon

Dato che alla costante MAX è stato assegnato il valore 9, la funzione fgets ha letto i primi 9-1=8 caratteri dal file (spazio incluso). Mentre se il file da leggere contiene il seguente testo:

"Ciao 

mondo!"

Se rieseguiamo lo stesso programma di prima, la funzione fgets ci restituisce la seguente stringa: "Ciao", infatti all’interno del file la parola "Ciao" e "mondo" si trovano su due righe diverse, ovvero separate dal carattere '\n' o newline.