lunedì 13 dicembre 2010

C: leggere dati da file scartando testo e commenti

Si supponga di avere un file simile a questo
 #commento1 
valore 1
valore 2
# commento2
valore 3
# commento 3
# commento 4
valore 4
valore 5
valore 6

Si supponga di voler estrapolare da esso i valori escludendo sia il testo superfluo che i commenti.

Il seguente codice descrive un possbile modo per farlo.
 #include <stdio.h> 

int main ( void )
{
static const char filename[] = "file.txt";

FILE *file = fopen ( filename, "r" );

if ( file != NULL )
{
/* here, 4096 is the maximum line size */
char line [ 4096 ];
int i;

/* read a line */
while ( fgets ( line, sizeof(line), file ) != NULL )
{
if(line[0]!='#')
{
sscanf( line, "valore %d\n", &i );
printf("%d\n",i);
}
}
fclose ( file );

}
else
{
perror ( filename );
}

return 0;
}

L'esecuzione del programma descritto sul file di input precedentemente mostrato conduce alla seguente esecuzione
 1
2
3
4
5
6

Il file viene letto una riga alla volta e le righe di commento vengono scartate (riconosciute tramite il carattere '#' iniziale). Se non si tratta di commento, il valore numerico viene estrapolato dalla stringa di testo.

IMPORTANTE: fgets non legge sempre una riga, legge tanti byte quanti sono specificati dal secondo argomento, in presenza di un simbolo di "a capo" interrompe la lettura anche se il numero di byte specificato non è stato raggiunto; quando questo accade si può dire che una riga è stata letta ma per ovvie ragioni è necessario essere certi che la lunghezza in caratteri di una riga non superi quella specificata come secondo argomento di fgets.

Nessun commento:

Posta un commento