Newsgroup: it.comp.lang.c
Titolo: HELP !!fscanf e suo controllo..

Salve a tutti, sono un neofita del C ed ho un problema con la funzione scanf
(fscanf):
io devo memorizzare una serie di dati da file txt che sono cosi riposti:
cod. esame  data       matricola     voto
01BFA  010211  183452  15
01BFA  010211  454545  18
01BFA  010211  10923  28
01BFA  010320  183452  13
01BFA  010503  183452  18
M2170  010214  34256  0
02EEU  010217  228970  30
02EEU  010217  183452  27
...
questi dati vanno ordinati in una struttura del tipo
struct found
{
     char codice[VET];
     struct dati[MAX];
};
dove dati č un'altra struttura cosě fatta:
struct dati
{
     long int data;
     long int matricola;
     int voto;
};
Io vorrei fare in modo che quando fscanf legge la seconda riga del file si
accorga che il codice esame č lo stesso della riga precedente e riporre i
restanti dati  nella stessa struttura esterna iun modo da tenere conto di
questo elemento in comune.
A fine lettura dovrei avere  un vettore di  strutture esterne(un elemento
per ogni codice esame) che contiene un vettore di strutture in cui sono
memorizzati gli altri dati dello studente.
In questo modo quando fscanf legge un nuovo codice esame dovrebbe aggiungere
un elemento al vettore di strutture esterno e memorizzarci dentro i dati
(sotto forma di elementi del vettore interno).
Lo scopo finale č quello di avere tante strutture esterne (quanti sono i
codici esami)  ognuna delle quali ha tante strutture interne (vettore di
strutture) quanti sono gli elementi che hanno quel determinato codice esame.
Esiste un  modo per farlo  ??
vi prego aiutatemi, ho provato a ricostruire le strutture esterne ma mi sono
perso con gli indici.
spero di avere esposto il problema in modo chiaro.
grazie,
davide

 ha scritto nel messaggio
news:9nlnil$tg2$1...@lacerta.tiscalinet.it...


 };
Volendo fare in modo di aggiungere un numero indeterminato di elementi
ad una struttura, personalmente userei una lista o un buffer, con i
quali puoi allocare dinamicamente un elemento senza preoccuparti di dove
vada a finire; con il vettore invece non credo si possano aggiungere
elementi durante l'esecuzione (se si potesse spero che qualcuno voglia
illuminarmi). Si potrebbe quindi riciclare la struttura "found" da te
proposta per creare una lista di esami in base al loro codice,
sostituendo al posto di struct dati[MAX} un puntatore ad una lista di
strutture "dati", cioè:
struct found {
	char codice[VET];
	struct dati *datiptr;
};
dove datiptr punta al primo elemento della lista di "dati" corispondente
all'esame identificato dal codice.
Ogni volta che viene letta una stringa con fscanf se il codice non
esiste viene allocato un "found" ed aggiunto alla lista degli esami, e
contemporaneamente viene inizializzata una nuova lista di "dati",
allocando un nuovo elemento di "dati" e facendolo puntare dal puntatore
del "found" appena creato; se invece il codice esiste già, verrà
allocato solo un elemento della struttura "dati" ed aggiunto alla lista
esistente.
Spero di essere stato chiaro, e soprattutto di non aver detto
stupidaggini; sono anche io abbastanza nuovo (non tanto con il C, quanto
con informatica ed algoritmi in generale).
Cecco

 devi usare la funzione strcmp(stringa 1, stringa2);
In realtà con fscanf ti copi tutta la stringa contenuta nel file fino al
primo '\n', poi andrà suddivisa nelle parti che interessano; nel caso
specifico andrà copiata la parte di stringa contenente il codice in una
stringa temporanea per il confronto, che può essere fatto con strcmp.
Cecco

 esistente.
Immaginavo che si facesse coi pointers (che tra l'altro non conosco ancora
bene visto che uso i C da 2 settimane per un esame)..
cmq così definita la nuova struttura:
struct found {
 char codice[VET];
 struct dati *datiptr;
 };
come associo al puntatore il valore letto (come se fosse una variabile
qualunque ??), e soprattutto, quando devo fargli stampare i dati (l'output
deve essere il seguente, digitata una matricola ex 183452 devo stampare
sullo stdio:
Matricola studente :183452
Corso 01BFA: appelli 3
    1. 010211    15
    2. 010320    13
    3.  010503    18
Corso 02EEU: appelli 1
    1. 010217    27
) come faccio a stampare i diversi dati ? come richiamo il loro valore??
davide.

 ) come faccio a stampare i diversi dati ? come richiamo il loro valore??
Esattamente come č stato fatto per l'assegnazione: ad esempio per
stampare a schermo la matricola e il voto di un oggetto puntato da
datiptr:
printf("%d %d", datiptr->matricola, datiptr->voto);
quindi potresti fare una procedura per stampare nel formato che vuoi i
dati, ad esempio passando alla funzione il puntatore alla struttura
found di cui vuoi stampare gli appelli.
NB: se posso permettermi di darti un consiglio, credo che sarebe bene
che ti imparassi bene i puntatori prima di intraprendere questa strada.
Inoltre, se sei totalmente all'oscuro di strutture dati, non sarebbe
male che ti studiassi un po' anche quelle.
Cecco