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);