marfer3
03-09-2004, 20:07
Stavo risolvendo il testo di questo problema con il seguente programma che però mi da' qualche problemuccio: qualcuno di voi mi darebbe una mano?
le funzioni fread mi danno come valore di ritorno 0. Perchè???
Grazie.
/*
Su un file binario (super.dat) sono stati registrati i prodotti in vendita in un negozio
di articoli sportivi.
Ogni articolo è caratterizzato da un codice alfanumerico univoco, una breve descrizione, il prezzo e la marca.
Tale file è ordinato in ordine crescente rispetto al codice articolo.
Impostare una procedura, guidata da menù,che preveda le seguenti opzioni:
1- dato un codice articolo, aumentare il suo prezzo del 2%
2- aumentare i prezzi di tutti gli articoli del 20%
3- stampare tutti gli articoli della stessa marca data in input
4- su un file ASCII (acquisto.txt) sono stati registrati i codici degli articoli acquistati da un cliente, stanmpare il
totale da pagare.
5- fine elaborazione
*/
#include "stdio.h"
struct sprod
{
char codice[10];
char descr[100];
float prezzo;
char marca[15];
};
void aggiungiprodotto(void);
int aumentacodice(char *cod);
int aumentatutti(void);
float prezzocodice(char *cod);
float calcolatotale();
void main(void)
{
int scelta;
char codicer[10];
char marcar[15];
do
{
clrscr();
printf("0-Aggiungere nuovo prodotto\n");
printf("1-dato un codice articolo, aumentare il suo prezzo del 20%\n");
printf("2-Aumentare i prezzi di tutti gli articoli del 20%\n");
printf("3-Stampare tutti gli articoli della stessa marca data in input\n");
printf("4-stampare il totale da pagare\n");
printf("5-Uscita\n");
printf("Scegli: ");
scanf("%d",&scelta);
fflush(stdin);
switch(scelta)
{
case 0:
aggiungiprodotto();
break;
case 1:
printf("Inserire codice da modificare: ");
gets(codicer);
if(aumentacodice(codicer))
printf("\nPrezzo modificato");
else
printf("\nCodice non trovato");
getch();
break;
case 2:
if(aumentatutti())
printf("\nPrezzi modificati");
else
printf("\nNessun prodotto trovato");
getch();
break;
case 3:
printf("Inserire marca da visualizzare: ");
gets(marcar);
if(visualizzamarca(marcar)==0)
printf("\nNessun prodotto trovato");
getch();
break;
case 4:
printf("\nIl totale da pagare e' : %f",calcolatotale());
getch();
break;
case 5:
break;
default:
printf("Scelta errata");
}
}while(scelta!=5);
}
void aggiungiprodotto(void)
{
struct sprod prod;
FILE *fp;
int temp;
fp=fopen("super.dat","a");
printf("Inserire codice: ");
gets(prod.codice);
printf("Inserire descrizione: ");
gets(prod.descr);
printf("Inserire prezzo: ");
scanf("%f",&prod.prezzo);
fflush(stdin);
printf("Inserire marca: ");
gets(prod.marca);
temp=fwrite(&prod,sizeof(struct sprod),1,fp);
fclose(fp);
}
int aumentacodice(char *cod)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp); // ritorna sempre 0
if (n==0) break;
if(strcmp(prod.codice,cod)==0)
{
trovato=1;
prod.prezzo=prod.prezzo*1.2;
fseek(fp,pos,0);
fwrite(&prod,sizeof(struct sprod),1,fp);
break;
}
}
fclose(fp);
return trovato;
}
//--------------------------------------------
//funzione parzialmente non funzionante, modifica solo il primo record
int aumentatutti(void)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos,temp1,temp2,temp3;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp);
temp1=ftell(fp);
if (n==0) break;
trovato=1;
prod.prezzo=prod.prezzo*1.2;
fseek(fp,pos,0);
temp2=ftell(fp);
fwrite(&prod,sizeof(struct sprod),1,fp);
temp3=ftell(fp);
}
fclose(fp);
return trovato;
}
//------------------------------------------------------
int visualizzamarca(char *marca)
{
struct sprod prod;
FILE *fp;
int n,trovato=0;
fp=fopen("super.dat","r");
for (;;)
{
n=fread(&prod,sizeof(struct sprod),1,fp);
if (n==0) break;
if(strcmp(prod.marca,marca)==0)
{
trovato++;
printf("\n%s %s %f %s",prod.codice,prod.descr,prod.prezzo,prod.marca);
}
}
fclose(fp);
return trovato;
}
//--------------------------------------
float prezzocodice(char *cod)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp);
if (n==0) break;
if(strcmp(prod.codice,cod)==0)
{
fclose(fp);
return prod.prezzo;
break;
}
}
fclose(fp);
return 0;
}
float calcolatotale()
{
FILE *fp;
float totale=0;
char cod[10];
fp=fopen("acquisto.txt","r");
while(fscanf(fp,"%s",cod)!=-1)
totale=totale+prezzocodice(cod);
fclose(fp);
return totale;
}
le funzioni fread mi danno come valore di ritorno 0. Perchè???
Grazie.
/*
Su un file binario (super.dat) sono stati registrati i prodotti in vendita in un negozio
di articoli sportivi.
Ogni articolo è caratterizzato da un codice alfanumerico univoco, una breve descrizione, il prezzo e la marca.
Tale file è ordinato in ordine crescente rispetto al codice articolo.
Impostare una procedura, guidata da menù,che preveda le seguenti opzioni:
1- dato un codice articolo, aumentare il suo prezzo del 2%
2- aumentare i prezzi di tutti gli articoli del 20%
3- stampare tutti gli articoli della stessa marca data in input
4- su un file ASCII (acquisto.txt) sono stati registrati i codici degli articoli acquistati da un cliente, stanmpare il
totale da pagare.
5- fine elaborazione
*/
#include "stdio.h"
struct sprod
{
char codice[10];
char descr[100];
float prezzo;
char marca[15];
};
void aggiungiprodotto(void);
int aumentacodice(char *cod);
int aumentatutti(void);
float prezzocodice(char *cod);
float calcolatotale();
void main(void)
{
int scelta;
char codicer[10];
char marcar[15];
do
{
clrscr();
printf("0-Aggiungere nuovo prodotto\n");
printf("1-dato un codice articolo, aumentare il suo prezzo del 20%\n");
printf("2-Aumentare i prezzi di tutti gli articoli del 20%\n");
printf("3-Stampare tutti gli articoli della stessa marca data in input\n");
printf("4-stampare il totale da pagare\n");
printf("5-Uscita\n");
printf("Scegli: ");
scanf("%d",&scelta);
fflush(stdin);
switch(scelta)
{
case 0:
aggiungiprodotto();
break;
case 1:
printf("Inserire codice da modificare: ");
gets(codicer);
if(aumentacodice(codicer))
printf("\nPrezzo modificato");
else
printf("\nCodice non trovato");
getch();
break;
case 2:
if(aumentatutti())
printf("\nPrezzi modificati");
else
printf("\nNessun prodotto trovato");
getch();
break;
case 3:
printf("Inserire marca da visualizzare: ");
gets(marcar);
if(visualizzamarca(marcar)==0)
printf("\nNessun prodotto trovato");
getch();
break;
case 4:
printf("\nIl totale da pagare e' : %f",calcolatotale());
getch();
break;
case 5:
break;
default:
printf("Scelta errata");
}
}while(scelta!=5);
}
void aggiungiprodotto(void)
{
struct sprod prod;
FILE *fp;
int temp;
fp=fopen("super.dat","a");
printf("Inserire codice: ");
gets(prod.codice);
printf("Inserire descrizione: ");
gets(prod.descr);
printf("Inserire prezzo: ");
scanf("%f",&prod.prezzo);
fflush(stdin);
printf("Inserire marca: ");
gets(prod.marca);
temp=fwrite(&prod,sizeof(struct sprod),1,fp);
fclose(fp);
}
int aumentacodice(char *cod)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp); // ritorna sempre 0
if (n==0) break;
if(strcmp(prod.codice,cod)==0)
{
trovato=1;
prod.prezzo=prod.prezzo*1.2;
fseek(fp,pos,0);
fwrite(&prod,sizeof(struct sprod),1,fp);
break;
}
}
fclose(fp);
return trovato;
}
//--------------------------------------------
//funzione parzialmente non funzionante, modifica solo il primo record
int aumentatutti(void)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos,temp1,temp2,temp3;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp);
temp1=ftell(fp);
if (n==0) break;
trovato=1;
prod.prezzo=prod.prezzo*1.2;
fseek(fp,pos,0);
temp2=ftell(fp);
fwrite(&prod,sizeof(struct sprod),1,fp);
temp3=ftell(fp);
}
fclose(fp);
return trovato;
}
//------------------------------------------------------
int visualizzamarca(char *marca)
{
struct sprod prod;
FILE *fp;
int n,trovato=0;
fp=fopen("super.dat","r");
for (;;)
{
n=fread(&prod,sizeof(struct sprod),1,fp);
if (n==0) break;
if(strcmp(prod.marca,marca)==0)
{
trovato++;
printf("\n%s %s %f %s",prod.codice,prod.descr,prod.prezzo,prod.marca);
}
}
fclose(fp);
return trovato;
}
//--------------------------------------
float prezzocodice(char *cod)
{
struct sprod prod;
FILE *fp;
int n,trovato=0,pos;
fp=fopen("super.dat","r+");
for (;;)
{
pos=ftell(fp);
n=fread(&prod,sizeof(struct sprod),1,fp);
if (n==0) break;
if(strcmp(prod.codice,cod)==0)
{
fclose(fp);
return prod.prezzo;
break;
}
}
fclose(fp);
return 0;
}
float calcolatotale()
{
FILE *fp;
float totale=0;
char cod[10];
fp=fopen("acquisto.txt","r");
while(fscanf(fp,"%s",cod)!=-1)
totale=totale+prezzocodice(cod);
fclose(fp);
return totale;
}