Stampa le righe con la data di oggi

Si supponga di aver memorizzato degli appuntamenti su un file, in questo modo: ogni linea contiene una data, nel formato giorno/mese/anno, uno o più spazi, e una frase che descrive l'appuntamento.

Data una stringa che descrive una data, vogliamo sapere quali sono gli appuntamenti previsti per quella data. Quindi, se la stringa è "2/3/2001", allora vogliamo stampare tutte le linee che iniziano con questa stringa.

Sono ovviamente possibili diverse soluzioni a questo problema. Sappiamo però che ò necessario leggere una riga di file per volta (dal momento che è questo che va stampato alla fine se la data coincide con quella data). Inoltre, è necessario confrontare la parte iniziale della linea con la data di oggi. Per confrontare due stringhe il C mette a disposizione la funzione strcmp, che restituisce 0 solo se le due stringhe passate come argomento sono uguali.

L'unica difficoltà, a questo punto, è quella di estrarre dalla linea letta da file la parte iniziale che descrive la data. Per fare questo, possiamo usare la funzione sscanf, facendo una lettura di stringa con il formato "%s".

Il programma finale data.c legge una linea da file per volta. Per ogni linea, legge la stringa iniziale con sscanf(buf, "%s", primo): in questo modo, primo contiene ora la prima parte della stringa buf (fino al primo spazio). Per verificare se la parte iniziale della linea coincide con la stringa data, si può ora usare la funzione strcmp. Se questa funzione ritorna 0, si stampa l'intera linea.

/*
  Cerca in un file le righe che iniziano
con la data corrente. Usa una striga
costante per la data.
*/

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

int main() {
  FILE *fd;
  char *oggi="2/3/2001";
  char buf[200];
  char *res;
  char primo[200];


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


		/* scansione del file */
  while(1) {

    res=fgets(buf, 200, fd);
    if( res==NULL )
      break;

    sscanf(buf, "%s", primo);

    if( !strcmp(primo,oggi) )
       printf("%s", buf);
  }


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

  return 0;
}