#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#define MAXS1 30
#define MAXS2 50
#define MAXS3 4
typedef struct {
int codice;
char nome[MAXS2];
char categoria[MAXS1];
char provenienza[MAXS1];
int scorta;
float costo;
} TPprodotto;
typedef struct TPprodtemp{
int codice;
char nome[MAXS2];
char categoria[MAXS1];
char provenienza[MAXS1];
int scorta;
float costo;
struct TPprodtemp *next;
} TPprodmag;
FILE *fp, *fq, *fk;
TPprodmag *magazzino;
void lettura(FILE *fp);
void inserimento(FILE *fq);
void stampa(TPprodmag *magazzino);
void eliminazione(FILE *fp);
void memorizzazione(FILE *fk);
void errore();
void libera_memoria(TPprodmag *magazzino);
int main(int argc, char *argv[]){
lettura(fp);
inserimento(fq);
stampa(magazzino);
eliminazione(fp);
stampa(magazzino);
memorizzazione(fk);
errore();
}
void lettura(FILE *fp){
TPprodotto prodotto;
TPprodmag *IT, *ITprev;
int n=0, i=0;
if((fp=fopen("magazzino.dat", "rb+"))==NULL){
puts(" Impossibile aprire il file");
errore();
}
while(!feof(fp)){
//allocazione della memoria per ogni prodotto
if((IT=malloc(sizeof(TPprodmag)))==NULL){
puts(" Impossibile allocare memoria");
errore();
}
memset(IT, 0, sizeof(TPprodmag));
//lettura dei prodotti dal file
n=fread(&prodotto.codice, MAXS3, 1,fp);
if(n!=1){
puts(" Errore nella lettura 1");
errore();
}
n=fread(prodotto.nome, MAXS2, 1,fp);
if(n!=1){
puts(" Errore nella lettura 2");
errore();
}
n=fread(prodotto.categoria, MAXS1, 1,fp);
if(n!=1){
puts(" Errore nella lettura 3");
errore();
}
n=fread(prodotto.provenienza, MAXS1+2, 1,fp);
if(n!=1){
puts(" Errore nella lettura 4");
errore();
}
n=fread(&prodotto.scorta, MAXS3, 1,fp);
if(n!=1){
puts(" Errore nella lettura 5");
errore();
}
n=fread(&prodotto.costo, MAXS3, 1,fp);
if(n!=1){
puts(" Errore nella lettura 6");
errore();
}
//stampa dei prodotti caricati
printf(" Codice:\t\t\t%d\n", prodotto.codice);
printf(" Nome:\t\t\t\t%s\n", prodotto.nome);
printf(" Categoria:\t\t\t%s\n", prodotto.categoria);
printf(" Provenienza:\t\t\t%s\n", prodotto.provenienza);
printf(" Scorta:\t\t\t%d\n", prodotto.scorta);
printf(" Costo:\t\t\t\t%.2f\n\n", prodotto.costo);
//se IT è a NULL non ho elementi nella lista quindi
//lo prendo come testa(*magazzino) della lista
if(IT==NULL){
magazzino=IT;
}
//copia dei prodotti nella struttura dinamica
IT->codice=prodotto.codice;
strcpy(IT->nome, prodotto.nome);
strcpy(IT->categoria, prodotto.categoria);
strcpy(IT->provenienza, prodotto.provenienza);
IT->scorta=prodotto.scorta;
IT->costo=prodotto.costo;
//inserimento in coda
ITprev->next=IT;
ITprev=IT;
}
}
void inserimento(FILE *fq){
TPprodotto prodotto;
TPprodmag *IT, *ITprev;
int n=0;
//lettura da file dei nuovi prodotti
if((fq=fopen("articoliex.dat", "r"))==NULL){
puts(" Impossibile aprire il file");
errore();
}
while(!feof(fq)){
if((IT=malloc(sizeof(TPprodmag)))==NULL){
puts(" Impossibile allocare memoria");
errore();
}
n=fread(&prodotto.codice, sizeof(int), 1, fq);
if(n!=0){
puts(" Errore di lettura 1");
errore();
}
IT=magazzino;
//finchè non si trova un codice uguale o non si è arrivati
//a fondo lista
while(prodotto.codice!=IT->codice && IT==NULL){
ITprev=IT;
IT=IT->next;
}
//aggiornamento prodotto
if(IT!=NULL){
n=fread(&prodotto.scorta, sizeof(int), 1, fq);
if(n!=0){
puts(" Errore di lettura 5");
errore();
}
IT->scorta=prodotto.scorta;
}
//nuovo prodotto
else{
n=fread(prodotto.nome, sizeof(char), 1, fq);
if(n!=0){
puts(" Errore di lettura 2");
errore();
}
n=fread(prodotto.categoria, sizeof(char), 1, fq);
if(n!=0){
puts(" Errore di lettura 3");
errore();
}
n=fread(prodotto.provenienza, sizeof(char), 1, fq);
if(n!=0){
puts(" Errore di lettura 4");
errore();
}
n=fread(&prodotto.scorta, sizeof(int), 1, fq);
if(n!=0){
puts(" Errore di lettura 5");
errore();
}
n=fread(&prodotto.costo, sizeof(float), 1, fq);
if(n!=0){
puts(" Errore di lettura 6");
errore();
}
IT->codice=prodotto.codice;
strcpy(IT->nome, prodotto.nome);
strcpy(IT->categoria, prodotto.categoria);
strcpy(IT->provenienza, prodotto.provenienza);
IT->scorta=prodotto.scorta;
IT->costo=prodotto.costo;
//inserimento in coda
ITprev->next=IT;
}
}
}
void stampa(TPprodmag *magazzino){
TPprodmag *IT, *ITprev;
//stampa dei prodotti a magazzino
IT=magazzino;
while(IT!=NULL){
printf(" Codice:\t\t\t%d\n", IT->codice);
printf(" Nome:\t\t\t%s\n", IT->nome);
printf(" Categoria:\t\t\t%s\n", IT->categoria);
printf(" Provenienza:\t\t\t%s\n", IT->provenienza);
printf(" Scorta:\t\t\t%d\n", IT->scorta);
printf(" Costo:\t\t\t%.2f\n", IT->costo);
printf("\n\n");
ITprev=IT;
IT=IT->next;
}
}
void eliminazione(FILE *fp){
TPprodmag *IT, *ITprev;
IT=magazzino;
while(IT!=NULL || IT->codice!=985){
ITprev=IT;
IT=IT->next;
}
ITprev->next=IT->next;
free(IT);
IT=magazzino;
while(IT!=NULL || IT->codice!=1015){
ITprev=IT;
IT=IT->next;
}
ITprev->next=IT->next;
free(IT);
IT=magazzino;
while(IT!=NULL || IT->codice!=1150){
ITprev=IT;
IT=IT->next;
}
ITprev->next=IT->next;
free(IT);
}
void memorizzazione(FILE *fk){
TPprodotto prodotto;
TPprodmag *IT;
int n=0;
if((fk=fopen("magazzino_aggiornato.dat", "wb"))==NULL){
puts(" Impossibile allocare memoria");
errore();
}
IT=magazzino;
while(!feof(fk)){
prodotto.codice=IT->codice;
n=fwrite(&prodotto.codice, sizeof(int), 1, fk);
if(n!=0){
puts(" Errore di scrittura 1");
errore();
}
strcpy(prodotto.nome, IT->nome);
n=fwrite(prodotto.nome, sizeof(char), 1, fk);
if(n!=0){
puts(" Errore di scrittura 2");
errore();
}
strcpy(prodotto.categoria, IT->categoria);
n=fwrite(prodotto.categoria, sizeof(char), 1, fk);
if(n!=0){
puts(" Errore di scrittura 3");
errore();
}
strcpy(prodotto.provenienza, IT->provenienza);
n=fwrite(prodotto.provenienza, sizeof(char), 1, fk);
if(n!=0){
puts(" Errore di scrittura 4");
errore();
}
prodotto.scorta=IT->scorta;
n=fwrite(&prodotto.scorta, sizeof(int), 1, fk);
if(n!=0){
puts(" Errore di scrittura 5");
errore();
}
prodotto.costo=IT->costo;
n=fwrite(&prodotto.costo, sizeof(float), 1, fk);
if(n!=0){
puts(" Errore di scrittura 6");
errore();
}
IT=IT->next;
}
}
void libera_memoria(TPprodmag *magazzino){
TPprodmag *IT, *ITprev;
IT=magazzino;
while(IT!=NULL){
ITprev=IT;
IT=IT->next;
free(ITprev);
}
}
void errore(){
libera_memoria(magazzino);
fclose(fp);
fclose(fq);
fclose(fk);
exit;
}