PDA

View Full Version : [C] problema con logica fscanf()


Freaxxx
14-09-2011, 21:56
devo usare fscanf per acquisire il contenuto di un file, il file è strutturato come segue:

prima riga = un intero N
seconda riga = un elenco di N stringhe
da terza riga fino a EOF = è disposta una matrice NxN di interi

cioé

3
cane quaderno penna
342 22 6589
12 5555 15
74 205 73

adesso il mio problema è dare la logica giusta a fscanf() considerato che come variabili ho a disposizione

int N
char elenco[][] ( per contenere le stringhe sia carattere per carattere sia come stringhe )
int matrice[][]

il maggior problema l'ho riscontrato ( sempre logicamente ) nell'operatore di conversione da attribuire a fscanf e nel fatto che questo sia sequenziale durante le sue operazioni, quindi a me servirebbe comportarmi diversamente a seconda delle righe incontrate ( alla prima devo operare su un tipo di dato, sulla seconda altro tipo di dato e dalla terza in poi ritorno agli int )

se faccio fscanf(f,"%c",&c) è forse la scrittura migliore ma gli int mi diventano cifre singole anche se sono a doppia, tripla etc ... cifra, così non ho problemi con le stringhe perché mi fermo al primo carattere di tabulazione, ma gli int perdono il loro significato.

AngeL)
15-09-2011, 03:06
Puoi usare %d per leggere un intero e %s per leggere una stringa (o meglio, parola, in quanto legge fino al primo carattere whitespace).

Farei quindi:

//leggi l'intero
fscanf(f,"%d",&N);

//leggi le stringhe
for(int i = 0; i < N; i++)
fscanf(f,"%s",elenco[i]); //supponendo sia un array di blocchi di char allocati dinamicamente

//leggi la matrice
for(int r = 0; r < N; r++)
for(int c = 0; c < N; c++)
fscanf(f,"%d",&matrice[r][c]);

Freaxxx
15-09-2011, 18:03
Puoi usare %d per leggere un intero e %s per leggere una stringa (o meglio, parola, in quanto legge fino al primo carattere whitespace).

Farei quindi:

//leggi l'intero
fscanf(f,"%d",&N);

//leggi le stringhe
for(int i = 0; i < N; i++)
fscanf(f,"%s",elenco[i]); //supponendo sia un array di blocchi di char allocati dinamicamente

//leggi la matrice
for(int r = 0; r < N; r++)
for(int c = 0; c < N; c++)
fscanf(f,"%d",&matrice[r][c]);

grazie mille, era proprio quello che cercavo :)

AngeL)
15-09-2011, 22:12
grazie mille, era proprio quello che cercavo :)

Allora questo (http://en.wikipedia.org/wiki/Printf#Format_placeholders) ti sarà ancor più d'aiuto ;)