Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C] Funzione fprintf

    Come mai quando chiamo la funzione fscanf() mi legge solo i primi valori del file?

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

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    Re: [C] Funzione fprintf

    while(fscanf(fp,"%s\t%s\t%d\n",u.nome,u.diff,&u.te mpo)>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.

  3. #3
    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...

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    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:
    codice:
    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.

  5. #5
    Fa esattamente come prima... e comunque le avevo stampate in questo modo...
    codice:
    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+)

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    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:
    codice:
    rewind(fp);
    Oppure:
    codice:
    fseek(fp,0,SEEK_SET);

  7. #7
    Originariamente inviato da matteever
    Fa esattamente come prima... e comunque le avevo stampate in questo modo...
    codice:
    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:


    codice:
    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:

    codice:
    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?
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  8. #8
    Avevo fatto un errore nella modalità di apertura... Grazie a tutti...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.