Newsgroup: it.comp.lang.c
Titolo: fscanf non è mai EOF

Salve a tutti,
quale potrebbe essere il motivo per cui la fscanf non ritorna mai EOF?
le printf mi dicono che rimane sempre 0, il file è fatto da 3 numeri per
ogni riga, il terzo è decimale i primi due interi. Ottengo quindi un loop
infinito....
while(controllo!=EOF){
      if (i>=x){
       x=3*x;
       v=realloc(v,x*sizeof(int));
      }
      if (j>=x){
       x=2*x;
       pesi=realloc(pesi,x*sizeof(int));
      }
      controllo=fscanf(fp,"%d",&v[i++]);
   //   printf("letto 1 riga %i, %i\n",controllo,v[i-1]);
      controllo=fscanf(fp,"%d",&v[i++]);
  //    printf("letto 1 riga %i %i \n",controllo,v[i-1]);
      controllo=fscanf(fp,"%lf",&pesi[j++]);
   //   printf("letto 1 riga %i %lf \n\n",controllo,pesi[j-1]);
}
Grazie mille!
Daniele

 Daniele
La fscanf non ritorna mai EOF, ma il numero di
elementi che ha letto
fscanf(p_file, "%d%d", &a, &b)
può restituire: 
1 se riesce a leggere solo un valore
2 se (in questo caso) li legge tutti
0 se non legge nulla

 elementi da assegnare ritorna 0, non EOF.
Non è corretto: bisogna testare per 0 e per EOF.
fscanf() se incontra la fine del file prima di poter fare tutte le
conversioni, restituisce EOF.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 La fscanf non ritorna mai EOF
Falso.


 while (controllo != EOF && controllo !=0) {


Grazie, ora funziona, come al solito no nsapendo benissmo perché...
comunque la printf, quando č finito il file mi restituisce -1 , penso sia
questo il valore di EOF
Se perň volessi fare la fscanf sun una matrice, mi si impianta :
controllo=fscanf(fp,"%d",&v[i][j++]);
il vettore v allocato cosě:
    v=(int**)malloc(3*sizeof(int*));
    for (i=0;i<3;i++)
          v[i]=(int*)malloc((*M*2)*sizeof(int));
Grazie di nuovo!
Daniele

> La fscanf non ritorna mai EOF
Sorry...mi son confuso con la scanf

 Sorry...mi son confuso con la scanf
E hai sbagliato di nuovo: quel comportamento è valido per _tutta_ la
famiglia *scanf(), sia essa scanf(), fscanf(), sscanf() o qualunque altra.


 infinito....
Se fscanf ritorna 0, allora ci sono caratteri "illegali" nel file.
Se per esempio si trova il carattere 'x' nel file, ottieni un loop
infinito.
-- 
Horst

 ha scritto:

Vale la stessa cosa per scanf. EOF vuol dire che e` stata incontrata la
fine del file e non e` stata fatta alcuna conversione. 0 indica che non
e` stata fatta alcuna conversione ma era disponibile un input.
Ad esempio:
ret = scanf("%d", &i);
Se inserisco "foobar\n" ret conterra` zero: c'erano dei dati disponbili
su stdin ma non e` stata fatta nessuna conversione perche` nessuno
soddisfava lo specificatore indicato.
Se invece provoco subito un end-of-file (ctrl+d, ctrl+z o altro) ret
conterra` EOF.
Luca
-- 
Home: 
http://kronoz.cjb.net
Windows NT: Designed for the Internet. The Internet: Designed for Unix.

 famiglia *scanf(), sia essa scanf(), fscanf(), sscanf() o qualunque altra.
Questa non la sapevo!!!
Scusa ma la scanf non aggisce sui file, come fa a ritornare EOF?!?

 Scusa ma la scanf non aggisce sui file, come fa a ritornare EOF?!?
Okkey okkey...ho visto un pò di doc!! ;-)
non l'ho mai usata se non per studio, preferisco altre
funzioni...

 Scusa ma la scanf non aggisce sui file, come fa a ritornare EOF?!?
Le funzioni di input standard del C non conoscono la differenza tra ciò che
è file e ciò che non lo è (questa è un'eredità Unix).


 è file e ciò che non lo è (questa è un'eredità Unix).
eh già....oltretutto EOF viene utilizzato in alcuni casi, come
la famiglia scanf, per ritornare errore...
in unix, se in errore ritornano -1, ma effettivamente su molti
sistemi, la EOF è una define che vale -1.
Bene e grazie...

 la famiglia scanf, per ritornare errore...
Momento: "end of file" ed "errore" sono due concetti diversi.
EOF viene _SEMPRE_ utilizzato per segnalare la fine (attesa o inattesa) del
file.


 file.
Beh certo non era mia intenzione generalizzare i due concetti
diversi...