Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113

    scrittura file in formato testo

    ciao a tutti, ho un piccolo problema riguardante la scrittura su un file in modalità testo.
    vi metto parte del codice del programma intero:
    codice:
    .....
    if ((cfPtr = fopen("archivo.dat", "w")) == NULL ) {
                        printf("Il file non può essere aperto.\n");
                    } else {
                    i = 0;
                    printf("Inserisci i dati dell'esame\n");
                    printf("EOF per terminare\n");
                    while (!feof(stdin)) {
                        printf("Insersci denominazione esame, votazione e data\n");
                        scanf("%s %d %d %d %d", archi[i].denomi, &archi[i].voto, &archi[i].da.gg, &archi[i].da.mm, &archi[i].da.aa);
                        fprintf(cfPtr, "%15s%10d%10d%2d%2d\n", archi[i].denomi, archi[i].voto, archi[i].da.gg, archi[i].da.mm, archi[i].da.aa);
                        i++;
                    }
                    fclose(cfPtr);
                    }
                }
    ....
    come si vede apro un flusso di comunicazione con fopen e stampo i file letti dalla struct effettuando il conteggio tramite una veriabile contator (i). il problema è proprio qui..cioè nel file stampato dopo aver digitato Eof mi appare una riga con dati nulli. come posso evitare questo ???

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Puoi controllare il valore di ritorno di scanf
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    in che modo? mi fai un esempio?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da sizeof Visualizza il messaggio
    in che modo? mi fai un esempio?
    codice:
                             if(5==scanf("%s %d %d %d %d", archi[i].denomi, &archi[i].voto, &archi[i].da.gg, &archi[i].da.mm, &archi[i].da.aa))
                                     fprintf(cfPtr, "%15s%10d%10d%2d%2d\n", archi[i].denomi, archi[i].voto, archi[i].da.gg, archi[i].da.mm, archi[i].da.aa);
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    quindi considerando che scanf mi restituisce il valore intero del numero elementi letti, in questo caso verranno letti fino a 5 elementi..giusto?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da sizeof Visualizza il messaggio
    quindi considerando che scanf mi restituisce il valore intero del numero elementi letti, in questo caso verranno letti fino a 5 elementi..giusto?
    Più precisamente restituisce il numero di variabili "riempite" (non mi viene in mente in italiano xD), quindi in questo caso 5. Comunque sì, il concetto era quello...

    Poi comunque dovresti fare qualche controllo sull'input...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    il problema è che la variabile contatore mi serve effettivamenti per fare poi delle ricerche sulla struttura e quindi la utilizzo successivamente nella espressione condizionale del ciclo enumerativo for. per questo motivo metto (!feof(stdin)) e non un controllo esplicito sul numero di elementi...perchè in effetti non so quanti elementi saranno inseriti dallo standard input.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da sizeof Visualizza il messaggio
    il problema è che la variabile contatore mi serve effettivamenti per fare poi delle ricerche sulla struttura e quindi la utilizzo successivamente nella espressione condizionale del ciclo enumerativo for. per questo motivo metto (!feof(stdin)) e non un controllo esplicito sul numero di elementi...perchè in effetti non so quanti elementi saranno inseriti dallo standard input.
    Guarda che sai perfettamente che a ogni ciclo verranno letti da scanf 5 valori: 1 stringa e 4 interi.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Perché cosa succede al contatore se controlli la scanf?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    ok giusto.ma il problema è che quando inserisco EOF la i è gia autoincrementata e si aspetta un altro inserimento quando in effetti questo non avviene e quindi mi da sul file una riga così:
    0 0 0 0

    p.s. in effetti al contatore non succede nulla controllando la scanf.
    Ultima modifica di sizeof; 15-02-2014 a 20:59

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.