Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    15

    Urgente: Aprire File Con C++

    HO SCRITTO IL SEGUENTE PROGRAMMA CHE LEGGE MATRICOLA, VOTO I PROVA, VOTO II PROVA DAL FILE
    VOTI.TXT E CALCOLA A SECONDA DEI VOTI SE LA MATRICOLA E' STATA AMMESSA O DEVE RECUPERARE.
    MATRICOLA, VOTO I PROVA, VOTO II PROVA ED ESITO VENGONO MEMORIZZATI NEL FILE ESITO.TXT.

    #include<stdio.h>
    #include<conio.h>
    #define nmax 200

    typedef struct
    {
    int matricola;
    float votoIprova;
    float votoIIprova;
    char esitofinale;
    }votazione;

    int inizializza(votazione voti[]);
    void calcolaesito(votazione voti[], int icorrente);
    void stampastat(votazione voti[], int);
    void memorizza(votazione voti[], int);

    void main()
    {
    votazione voti[nmax];
    int dimarray;

    clrscr();
    dimarray=inizializza(voti);
    if (dimarray!=0)
    {
    stampastat(voti, dimarray);
    memorizza(voti, dimarray);
    }
    else printf("***IMPOSSIBILE LEGGERE DAL FILE VOTI.TXT***");
    }

    int inizializza(votazione voti[nmax])
    {
    FILE *fp;
    int i=0;

    if ((fp=fopen("voti.txt","r+t"))!=NULL)
    {
    while(feof(fp)==0)
    {
    fscanf(fp,"%d%f%f", &voti[i].matricola, &voti[i].votoIprova, &voti[i].votoIIprova);
    calcolaesito(voti,i);
    i++;
    }
    fclose(fp);
    return i;
    }
    else return 0;
    }

    void calcolaesito(votazione voti[nmax], int icorrente)
    {
    if ((voti[icorrente].votoIprova<7)||(voti[icorrente].votoIIprova<7))
    voti[icorrente].esitofinale='R';
    else voti[icorrente].esitofinale='A';
    }

    void stampastat(votazione voti[nmax], int dimarray)
    {
    int numammessi=0;
    int numrecuperi=0;
    int i;

    for (i=0;i<dimarray;i++)
    {
    if (voti[i].esitofinale=='A') numammessi++;
    else numrecuperi++;
    }
    printf("NUMERO AMMESSI: %d\nNUMERO RECUPERI: %d", numammessi, numrecuperi);
    }

    void memorizza(votazione voti[nmax], int dimarray)
    {
    FILE *fp;
    int i;

    if((fp=fopen("esito.txt","w+t"))==NULL)
    printf("***IMPOSSIBILE SCRIVERE SUL FILE ESITO.TXT***");
    else
    {
    for(i=0;i<dimarray;i++) fprintf(fp,"%d%f%f%c", voti[i].matricola, voti[i].votoIprova, voti[i].votoIprova, voti[i].esitofinale);
    fclose(fp);
    }
    }

    NON RIESCO A PRELEVARE CORRETTAMENTE L'INTERO E I DUE VIRGOLA MOBILE DAL FILE VOTI.TXT.
    COME DEVO SCRIVERE IL FILE VOTI.TXT PERCHE' FUNZIONINO CON L'ISTRUZIONE FSCANF SCRITTA NEL PROG.?
    HO PROVATO A SCRIVERE I DATI OGNUNO SU UNA RIGA E POI HO SCRITTO NEL PROGRAMMA
    fscanf(fp,"%d\n%f\n%f\n", &voti[i].matricola, &voti[i].votoIprova, &voti[i].votoIIprova);
    ANCHE SE NON SO SE HA MOLTO SENSO. COMUNQUE NEMMENO IN QUESTO MODO RIESCO A LEGGERE I DATI.
    ALL'ESECUZIONE DEL PROG. OTTENGO L'ERRORE "scanf : floating point formats not linked
    Abnormal program termination". COME MAI?
    GRAZIE IN ANTICIPO X LA DISPONIBILITA', VI PREGO DI ESSERE CHIARI.

  2. #2
    L'istruzione

    fscanf(fp,"%d%f%f", &voti[i].matricola, &voti[i].votoIprova, &voti[i].votoIIprova);
    è corretta.

    prova a scrivere voti.txt (con ad es. notepad) così:
    7
    8.2
    9.4
    5
    3.4
    5.6

    cioè dopo ogni numero premi invio (non hai bisogno di specificare "\n" nel fscanf.
    Ciao

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 © 2024 vBulletin Solutions, Inc. All rights reserved.