Linea più lunga di un file

In questo esercizio facciamo uso della funzione di lettura di una riga da file. Sia dato un file di testo, di cui assumiamo che le linee siano tutte lunghe al più 200 caratteri. Si vuole determinare quale è la lunghezza della linea più lunga del file. Per determinare la lunghezza di una stringa, possiamo usare la funzione strlen, che prende una stringa come argomento e ritorna la sua lunghezza. Se si preferisce, si può anche risolvere l'esercizio scrivendo una funzione che calcola quanti elementi ci sono nella stringa prima del carattere di fine stringa '\0'.

L'esercizio consiste in una lettura di un file linea per linea. In questo caso, la elaborazione consiste nel confronto fra la lunghezza della linea e la massima lunghezza di linea trovata fino ad ora. Usiamo quindi una variabile intera max per indicare quale è la massima lunghezza di una linea trovata fino a questo momento. Per ogni linea letta, confrontiamo la sua lunghezza con il contenuto di questa variabile, eventualmente aggiornando il valore di max.

Il programma completo piulunga.c è riportato qui sotto.

/*
   Trova la massima lunghezza di linea
in un file di testo.
*/

#include<stdlib.h>
#include<stdio.h>

int main() {
  FILE *fd;
  char buf[200];
  char *res;
  int max;


		/* apre il file */
  fd=fopen("piulunga.txt", "r");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* lettura per righe */
  max=0;
  while(1) {
    res=fgets(buf, 200, fd);
    if( res==NULL )
      break;
    if( strlen(buf)-1 > max )
      max=strlen(buf)-1;
  }


		/* chiude il file */
  fclose(fd);


		/* stampa la massima lunghezza */
  printf("Lunghezza massima di linea: %d\n", max);

  return 0;
}

Si noti che la lunghezza della linea letta è strlen(buf)-1 e non strlen(buf) come ci si potrebbe aspettare. Per capire come mai il programma funziona in questo modo, osserviamo che la funzione fgets legge una intera linea incluso il carattere di fine linea. Questo significa che se una linea è lunga dieci caratteri, la stringa che viene memorizzata è lunga undici caratteri, cioè i dieci che compongono effettivamente la linea più il carattere di ritorno a capo '\n'. La funzione strlen ritorna la lunghezza complessiva della stringa memorizzata, metre per noi la lunghezza di una linea di testo è il numero di caratteri nella linea, escluso quindi il carattere di ritorno a capo.

Se ci sono dubbi sul funzionamento della funzione fgets, si può provare a scrivere un programma che legge un file linea per linea, e per ogni linea stampa i valori numerici dei caratteri che stanno nella zona di memoria che contiene la linea letta. Questo dovrebbe chiarire cosa c'è nella zona di memoria dove viene messa le linea letta. Il programma leggilinea.c fa esattamente questo. Si provi ad eseguire su un file di testo con linee non più lunghe di diciannove caratteri, e si osservi il risultato. Il numero 10 è il valore numerico di '\n', mentre 0 è il terminatore di stringa.