PDA

Visualizza la versione completa : [C] Parsing di una linea con sscanf()


Ippo343
07-06-2010, 22:21
Salve a tutti, io ho un file di linee fatte in questo modo:

Un numero intero che rappresenta la matricola dello studente.
Una stringa che ne rappresenta il cognome.
Un numero che mi dice quanti esami ha sostenuto. (n)
I voti degli esami che ha sostenuto.

Il file purtroppo non l'ho fatto io, fatto cos e non posso modificarlo.

Io devo leggere il file linea per linea e ricostruire i dati dello studente. Per i primi te non c' alcun problema: io ricevo una stringa e li leggo cos:



sscanf(buf, "%d%s%d", &s->matricola, &s->nome, &s->n_esami);


(s un puntatore alla struttura Studente che sto usando).

Per, una volta letto il numero di esami sostenuti, alloco l'array per salvare i voti, e come faccio poi per leggerli? So che ci deve essere un metodo semplice ma non ci riesco... aiutino?

oregon
07-06-2010, 23:20
Non ho capito ... cosa non sai fare? Come fatto il file?

Ippo343
07-06-2010, 23:22
Il file solo una ripetizione di linee fatte tutte nello stesso modo:

n_matricola, Cognome, n_esami, [voti]

Quello che non riuscivo a fare era, una volta ottenuta questa stringa, a leggere l'array di voti (in quanto non potevo saperne a prescindere la dimensione).

Sono riuscito a risolvere usando strtok() per leggere la stringa parola per parola interpretandole.

Ciao!

oregon
07-06-2010, 23:24
Dopo aver allocato dinamicamente il vettore di voti, usi un ciclo for in cui usi la scanf ..

Ippo343
07-06-2010, 23:36
Non la scanf, ma sscanf. I dati arrivano dalla stringa che ho letto dal file, non dallo stdin.

Il problema per cui non riuscivo ad usare sscanf, era che:
1) prima dei dati dell'array ne avevo altri, e non sapevo come iniziare la lettura dal punto corretto della stringa
2) sscanf in ogni caso non funziona nei cicli, dato che ogni volta ricomincia a leggere dall'inizio della stringa:



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

int main()
{
int v[10];
char str[] = "10 11 12 13 14 15 16 17 18 19";
int i = 0;

for (i = 0; i < 10; i++)
sscanf(str, "%d", &v[i]);

for (i = 0; i < 10; i++)
printf("%d, ", v[i]);

return 0;
}


L'output di questo programma



10, 10, 10, 10, 10, 10, 10, 10, 10, 10,


e non



10, 11, 12, 13, 14, 15, 16, 17, 18, 19,


come vorrei io. Per questo ho dovuto usare strtok.

oregon
07-06-2010, 23:51
Originariamente inviato da Ippo343
sscanf in ogni caso non funziona nei cicli

Non detto ...



char *p=str;
for (i = 0; i < 10; i++)
{
sscanf(p++, "%d", &v[i]);
while(*p && (*p)!=' ') p++;
}

Ippo343
08-06-2010, 00:27
Mmm... hadn't considered that... Domani ci provo. Grazie oregon :)

Loading