PDA

Visualizza la versione completa : Urgente: Aprire File Con C++


Danileta
12-01-2003, 17:33
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.:dhò: :mad:

Tokamak
13-01-2003, 10:15
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

Loading