PDA

Visualizza la versione completa : [C] Funzione fprintf() e lettura dei soli primi valori di un file


matteever
16-01-2011, 21:54
Come mai quando chiamo la funzione fscanf() mi legge solo i primi valori del file?



fopen("punteggi.txt","r");
clrscr();
printf("Nome\tDifficolta'\tTempo(sec)\n");
while(fscanf(fp,"%s\t%s\t%d\n",u.nome,u.diff,&u.tempo)>0){
printf("%s\t%s\t%d\n",u.nome,u.diff,u.tempo);

ramy89
16-01-2011, 22:38
while(fscanf(fp,"%s\t%s\t%d\n",u.nome,u.diff,&u.tempo)>0)

Qual' è lo scopo di mettere la fscanf in un while?
Nel while la condizione necessaria è anche che sia maggiore di zero.La scanf ritorna il numero di elementi letti con successo.de u.diff e u.nome sono due puntatori la stai usando correttamente,ma non vedo la necessità di inserirla in un ciclo,forse intendevi metterla in un if.
Meglio se fai vedere tutto il codice interno.

matteever
16-01-2011, 22:46
La sua funzione è di andare fino alla fine del file, quando la funzione raggiunge un punto dove gli è impedito di leggere ritorna -1 e perciò il programma ha finito di leggere...

ramy89
17-01-2011, 01:04
In teoria dovresti usare EOF,è vero che EOF ha spesso il valore -1,ma può anche darsi che sia settato a zero,quindi prova con:


while(fscanf(fp,"%s\t%s\t%d\n",u.nome,u.diff,&u.tempo)!=EOF)

Può darsi che ti funziona,ma comunque dipende anche da cosa hai nel file.
Stai leggendo il file spaziando di 8 caratteri in 8,sappi che nel file i dati non sono separati ciascuno da 8 spazi (la tabulazione /t) alcuni te li salta.
Prova così e dimmi se funziona.

matteever
17-01-2011, 16:47
Fa esattamente come prima... e comunque le avevo stampate in questo modo...


fprintf(fp,"%s\t%s\t%d\n",u.nome,u.diff,u.tempo);

Forse c'entra in qualche mode la modalità di apertura?(ho usato a+)

ramy89
17-01-2011, 19:15
Certo,nel tuo codice usi "r".
Se vuoi leggere devi assicurarti di essere a inizio file.Per scrivere puoi usare la append,ma con la append parti da fine file.
Per riposizionare il cursore a inizio file puoi fare:


rewind(fp);

Oppure:


fseek(fp,0,SEEK_SET);

Laikius91
18-01-2011, 10:11
Originariamente inviato da matteever
Fa esattamente come prima... e comunque le avevo stampate in questo modo...


fprintf(fp,"%s\t%s\t%d\n",u.nome,u.diff,u.tempo);

Forse c'entra in qualche mode la modalità di apertura?(ho usato a+)

In che senso hai usato a+ ??
Nel codice che hai postato all'inizio hai messo correttamente la modalità di apertura "r" (dove t di text è giustamente implicito)...

Comunque per quanto riguarda l'inserimento della fscanf nel ciclo while entrambe le modalità che avete enunciato sono valide, infatti ci sono due modi per verificare di leggere un file fino alla fine:
1) poichè la fscanf ritorna il numero di elementi letti, si può far iterare fino a che legge il numero di elementi desiderati (consiglio di esplicitare questo piuttosto che impostare > 0 ), ad esempio:



while ((fscanf (f, "%d %d %d\n", &a, &b, &c)) == 3)

2) poichè i file di testo hanno EOF, si può far iterare fino a che non viene letto solo esso, ad esempio:


while ((fscanf (f, "%d %d %d\n", &a, &b, &c)) != EOF)

A mio parere, con la prima modalità si hanno più sicurezze...

Per quanto riguarda il tuo problema, l'unica cosa che mi viene in mente è, dato che sei tu che gli hai scritto sopra, l'hai chiuso prima di andare a rileggerlo?

matteever
19-01-2011, 16:42
Avevo fatto un errore nella modalità di apertura... Grazie a tutti...

Loading