Raga vi propongo questo pezzetto di codice scritto da me. Tralascio le funzioni perchè il programma funge perfettamente e la mia domanda riguarda solamente l'fscanf. Le righe da prendere in input dal file di testo sono in questo formato:
1A3F;Pomodori;230S34;Insalata;150S34;Insalata;5F34 5;Patate;3004C3;Carote;1804C3;Carote;71267;Salmone ;1
In pratica il primo codice a 4 cifre è l'identificativo, poi c'è la descrizione, quindi la quantità (nel primo caso la quantità dei pomodori è 23 e subito dopo inizia il seguente codice identificativo a 4 cifre (0S34)). Come vedete nel mio fscanf dico "prendi 5 caratteri sino al punto e virgola, poi 256 caratteri sino al punto e virgola e quindi un intero e passa alla nuova linea. Perfetto, ma come fa a sapere che l'intero si ferma a 23 (nel caso sempre dei pomodori) e non a 230 (dove 0 è il primo numero dell'identificativo seguente)? Nelle carote addirittura la quantità è di una cifra (7) e subito dopo l'intero è riferito al salmone. Potete illuminarmi?
codice:
int main(int argc, char *argv[])
{
//PUNTO 1
FILE* fp;
fp=fopen("dispensa.txt", "r");
if (fp==NULL){
printf ("Errore nell'apertura del file");
return 0;}
nodo il=NULL;
nodo p3=NULL;
char idi[5]; char descr[256]; int quant;
while(!feof(fp)){
fscanf(fp,"%5[^;];%256[^;];%d\n",idi,descr,&quant);
il=ricercanodo(p3,idi);
if(il==NULL){
il=malloc(sizeof(struct dispensa));
strcpy(il->id,idi);
il->desc=malloc(sizeof(char)*(strlen(descr)+1));
strcpy(il->desc,descr);
il->quantita=quant;
il->succ=NULL;
p3=inseriscicoda(p3,il);}
else {
il->quantita+=quant;}}
fclose(fp);
stampadispensa (p3);