Oppure

Loading
25/01/15 17:45
Sguaraus
Ho cambiato un po' di cose, ora non mi da errori di compilazione tuttavia l'esecuzione mi si blocca esattamente alla prima fread del ciclo while della 2° procedura. Salta fuori "errore di lettura 1" e si blocca

void inserimento(FILE *fp){
	TPprodotto prodotto;
	TPprodmag *IT, *ITprev;
	int n=0;
	
	//lettura da file dei nuovi prodotti
	if((fp=fopen("articoliex.dat", "rb"))==NULL){
		puts(" Impossibile aprire il file");
		errore();
	}
	while(!feof(fp)){
		n=fread(&prodotto.codice, MAXS3, 1, fp);
		if(n!=0){
			puts(" Errore di lettura 1");
			errore();
		}
		if((IT=malloc(sizeof(TPprodmag)))==NULL){
			puts(" Impossibile allocare memoria");
			errore();
		}
		memset(IT, 0, sizeof(TPprodmag));
		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, MAXS3, 1, fp);
			if(n!=0){
				puts(" Errore di lettura 5");
				errore();
			}
			IT->scorta=prodotto.scorta;
		}
		//nuovo prodotto
		else{
			n=fread(prodotto.nome, MAXS2, 1, fp);
			if(n!=0){
				puts(" Errore di lettura 2");
				errore();
			}
			n=fread(prodotto.categoria, MAXS1, 1, fp);
			if(n!=0){
				puts(" Errore di lettura 3");
				errore();
			}
			n=fread(prodotto.provenienza, MAXS1, 1, fp);
			if(n!=0){
				puts(" Errore di lettura 4");
				errore();
			}
			n=fread(&prodotto.scorta, MAXS3, 1, fp);
			if(n!=0){
				puts(" Errore di lettura 5");
				errore();
			}
			n=fread(&prodotto.costo, MAXS3, 1, fp);
			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;
		}
	}
	fclose(fp);
}
Ultima modifica effettuata da Sguaraus 25/01/15 17:46
aaa
25/01/15 21:19
Perché scrivi

if(n!=0)

?

Semmai deve essere

if(n!=MAXS3)
25/01/15 22:26
Sguaraus
Perchè mi son confuso con la fopen, appena ho un attimo sistemo. Grazie :)
Ultima modifica effettuata da Sguaraus 25/01/15 22:27
aaa
26/01/15 17:13
Sguaraus
no al limite (n!=1) ovvero il numero di elementi che gli dico di leggere
Ultima modifica effettuata da Sguaraus 26/01/15 18:00
aaa
26/01/15 19:07
Sì corretto ... la vista fa brutti scherzi a volte ... non vedevo l' 1 ...
26/01/15 21:45
Sguaraus
I problemi ora sono 2. Provo a ripostare il programma ora che l'ho snellito un po'.

Ultima modifica effettuata da Sguaraus 26/01/15 21:49
aaa
26/01/15 21:55
Sguaraus
Problema 1: riga 65

quando sono nel ciclo while e leggo e stampo i prodotti. Non so perché ma all'ultima esecuzione del ciclo il programma legge l'ultimo prodotto, dopodiché, invece che uscire dal ciclo, legge ancora una volta ma il puntatore è a fine file quindi legge sbagliato. Non contento, legge poi ancora una volta l'ultimo prodotto dopodiché lo stampa (non posso usare dei contatori per sapere quanti elementi fargli leggere).

Io avevo pensato di "sfruttare" il fatto che legge sbagliato assegnando ad n il valore di ritorno della fread per poi usare n come condizione del ciclo while. Così facendo però mi legge solo il primo elemento, poi passa alla funzione dopo. Mi è venuto il dubbio che forse la fread non restituisce esattamente il numero di elementi letti e che quindi è sempre diversa da 1 tranne alla prima esecuzione. Possibile??

Problema 2: riga 100

quando inizia a ciclare la funzione inserimento windows crasha.

Non ho proprio idea del perché.

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>

#define MAXS1 30
#define MAXS2 50

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;
TPprodmag *magazzino, *IT, *ITprev;

void lettura(FILE *fp);
void inserimento(FILE *fp);
void stampa(TPprodmag *magazzino);
void eliminazione(FILE *fp);
void memorizzazione(FILE *fp);
void errore();
void libera_memoria(TPprodmag *magazzino);

int main(int argc, char *argv[]){
	
	lettura(fp);
	puts("fun 1");
	inserimento(fp);
	puts("fun 2");
	stampa(magazzino);
	puts("fun 3");
	eliminazione(fp);
	puts("fun 4");
	stampa(magazzino);
	puts("fun 5");
	memorizzazione(fp);
	puts("fun 6");
	errore();
	puts("fun 7");
}

void lettura(FILE *fp){
	TPprodotto prodotto;
	int n=1;
	
	if((fp=fopen("magazzino.dat", "rb+"))==NULL){
		puts(" Impossibile aprire il file");
		errore();
	}
	while(n==1){
		//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, sizeof(TPprodotto), 1,fp);
		//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;
	}
	fclose(fp);
}

void inserimento(FILE *fp){
	TPprodotto prodotto;
	int n=1;
	
	memset(IT, 0, sizeof(TPprodmag));
	memset(ITprev, 0, sizeof(TPprodmag));
	//lettura da file dei nuovi prodotti
	if((fp=fopen("articoliex.dat", "rb"))==NULL){
		puts(" Impossibile aprire il file");
		errore();
	}
	while(n==1){
		n=fread(&prodotto.codice, sizeof(int), 1, fp);
		if(n!=1){
			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, fp);
			if(n!=1){
				puts(" Errore di lettura 5");
				errore();
			}
			IT->scorta=prodotto.scorta;
		}
		//nuovo prodotto
		else{
			n=fread(&prodotto, sizeof(TPprodotto), 1, fp);
			
			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;
		}
	}
	fclose(fp);
}

void stampa(TPprodmag *magazzino){
	
	memset(IT, 0, sizeof(TPprodmag));
	memset(ITprev, 0, sizeof(TPprodmag));
	//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){
	
	memset(IT, 0, sizeof(TPprodmag));
	memset(ITprev, 0, sizeof(TPprodmag));
	if((fp=fopen("magazzino.dat", "rb+"))==NULL){
		puts(" Impossibile aprire il file");
		errore();
	}
	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);
	fclose(fp);
}

void memorizzazione(FILE *fp){
	TPprodotto prodotto;
	int n=1;
	
	memset(IT, 0, sizeof(TPprodmag));
	if((fp=fopen("magazzino_aggiornato.dat", "wb"))==NULL){
		puts(" Impossibile allocare memoria");
		errore();
	}
	IT=magazzino;
	while(n!=0){
		prodotto.codice=IT->codice;
		n=fwrite(&prodotto.codice, sizeof(int), 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 1");
			errore();
		}
		strcpy(prodotto.nome, IT->nome);
		n=fwrite(prodotto.nome, sizeof(char)*MAXS2, 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 2");
			errore();
		}
		strcpy(prodotto.categoria, IT->categoria);
		n=fwrite(prodotto.categoria, sizeof(char)*MAXS1, 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 3");
			errore();
		}
		strcpy(prodotto.provenienza, IT->provenienza);
		n=fwrite(prodotto.provenienza, sizeof(char)*MAXS1, 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 4");
			errore();
		}
		prodotto.scorta=IT->scorta;
		n=fwrite(&prodotto.scorta, sizeof(int), 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 5");
			errore();
		}
		prodotto.costo=IT->costo;
		n=fwrite(&prodotto.costo, sizeof(float), 1, fp);
		if(n!=1){
			puts(" Errore di scrittura 6");
			errore();
		}
		IT=IT->next;
	}
	fclose(fp);
}

void libera_memoria(TPprodmag *magazzino){
	
	memset(IT, 0, sizeof(TPprodmag));
	memset(ITprev, 0, sizeof(TPprodmag));
	IT=magazzino;
	while(IT!=NULL){
		ITprev=IT;
		IT=IT->next;
		free(ITprev);
	}
}

void errore(){
	puts("ERROR 1");
	libera_memoria(magazzino);
	puts("ERROR 2");
	fclose(fp);
	puts("ERROR 3");
	exit;
}
Ultima modifica effettuata da Sguaraus 26/01/15 22:30
aaa