Quando fai sscanf(riga,"%f",dato) sbagli, perché dovresti indicare l'indirizzo della variabile dato, non il suo valore. Così: sscanf(riga,"%f",&dato);
In più, dovresti fare in modo che quando nel ciclo si individua una riga che inizia con '*' tutti i passi successivi del ciclo stesso vengano saltati, se no inserisci della porcheria in vett. Io farei così:
while( !feof(f) ){ // condizione di ciclo fino all'EOF
fgets( riga, dim, f );
if( '*' == riga[0] != '*' )
continue; { // evita che vengano lette le righe con * iniziale
sscanf( riga, "%f", &dato ); // prendi il float da riga e mettilo in dato
vett[i] = dato;
i++;
}
Oppure andrebbe bene anche così:
while( !feof(f) ){ // condizione di ciclo fino all'EOF
fgets( riga, dim, f );
if( riga[0] != '*' ) { // evita che vengano lette le righe con * iniziale
sscanf( riga, "%f", &dato ); // prendi il float da riga e mettilo in dato
vett[i] = dato;
i++;
}
}
Per brevità, anche se non cambia niente, potresti fare a meno della variabile dato e "inglobare" l'incremento di i nel sscanf().
while( !feof(f) ){ // condizione di ciclo fino all'EOF
fgets( riga, dim, f );
if( riga[0] != '*' ) // evita che vengano lette le righe con * iniziale
sscanf( riga, "%f", &vett[i++] ); // prendi il float da riga e mettilo in vett
}
Sempre per brevità, potresti sostituire il while con un for, così:
for( i=0; !feof(f); ){ // condizione di ciclo fino all'EOF
fgets( riga, dim, f );
if( riga[0] != '*' ) // evita che vengano lette le righe con * iniziale
sscanf( riga, "%f", &vett[i++] ); // prendi il float da riga e mettilo in vett
}
In uscita dal for (o dal while, se lo preferisci) hai in i la quantita' dei dati effettivamente letti, per cui per mostrare il contenuto di vett non dovresti andare fino a i+1, bensì solo fino a i:
for( n=0; n<i; n++ ) // stampa il vettore
printf( "%f", vett[i] );
Ancora, se guardi bene, con vett
stai mandando in console per tre volte l'ultimo valore letto. Invece di vett dovresti usare vett[n], perché è n il contatore che stai usando per "scorrere" il vettore.
for( n=0; n<i; n++ ) // stampa il vettore
printf( "%f", vett[n] );
In questo modo ti ritrovi con i tre valori in coda, ma "appiccicati" uno all'altro. Dovresti inserire nella stringa di formato di printf() un qualche carattere distanziatore, ad esempio:
for( n=0; n<i; n++ ) // stampa il vettore
printf( "%f\n", vett[n] );
Altre cose...
In genere, nei libri sul C che ho letto, le macro si indicano con caratteri tutti maiuscoli, tipo DIM anziché dim.
Userei una macro anche per indicare la quantità massima dei valori ammissibili, ad esempio definendo un MAX_VALORI anziché usare direttamente 15, e aggiungerei un controllo "antisfondamento" nel ciclo di lettura in vett[].
Potrebbe essere utile segnalare l'eventuale impossibilità di leggere tutti i valori presenti nel file.