Oppure

Loading
25/01/15 9:37
AldoBaldo
Tra le altre cose...

==========

fread(prodotto->codice, sizeof(int), 1,fp);

Così facendo, da come la vedo, pare che tu non stia fornendo un puntatore al campo "codice" della tua struttura, bensì stia fornendo il *valore numerico* di quel campo, il che significa che fread() va a scrivere chissà dove i dati letti.

Lo stesso qui:
fread(prodotto->scorta, sizeof(int), 1,fp);

==========

fread(prodotto->costo, sizeof(float), 1,fp);

Anche qui pare che tu non stia fornendo un puntatore al campo "costo" della tua struttura, bensì stia fornendo il *valore numerico* di quel campo. In più, il compilatore si lamenta perché riceve quello che dovrebbe essere un puntatore, ma lo riceve in un formato per lui "strano" nel contesto, ovvero un tipo float.

==========

fread(prodotto->nome, sizeof(char), 1, fp);

In quest'altro caso, invece, a me pare che tu stia leggendo solo il primo carattere della stringa che intendi leggere.

Lo stesso qui:
fread(prodotto->categoria, sizeof(char), 1, fp);
fread(prodotto->provenienza, sizeof(char), 1, fp);

==========


P.S. Se ho scritto delle stupidaggini qualcuno mi corregga, per favore.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
25/01/15 11:59
Sguaraus
Non vorrei sbagliarmi, ma se metto 1 dovrei leggere un elemento di grandezza sizeof(tipoelemento).
Se mettessi:

fread(&prodotto.codice, sizeof(int), 2, fp);

andrei a leggere una prima serie di bit corrispondenti alla dimensione int del codice, più un'altra serie di bit della dimensione precedente, ma che farebbero parte del campo successivo (nome) e quindi cannerei la lettura.

per lo meno, io ho capito così.
Ultima modifica effettuata da Sguaraus 25/01/15 12:13
aaa
25/01/15 12:12
Ovviamente la lettura sarebbe sbagliata. Ma perché non proponi il codice attuale come ti ho detto e dici cosa non va?
25/01/15 12:15
Sguaraus
Stavo finendo di modificare qualcosina...
#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;
}
Ultima modifica effettuata da Sguaraus 25/01/15 16:36
aaa
25/01/15 12:19
Sguaraus
ora quando mando in esecuzione, inizia a leggermi tutti i campi ma li legge sbagliati e continua a farlo finchè poi windows non mi da errore.

missà che c'è un errore nelle rige 114, 115, 116.
Ultima modifica effettuata da Sguaraus 25/01/15 12:24
aaa
25/01/15 12:33
Ci sono parecchie cose che non mi sembrano corrette ... dò un'occhiata ...
Ultima modifica effettuata da 25/01/15 12:42
25/01/15 12:42
Sguaraus
con magazzino=IT volevo "salvare" il primo elemento della lista nel caso in cui io debba scorrerla.

PS. ho spostato le istruzioni 114,115,116 tra la 105 e la 104. Penso che altrimenti non memorizzo mai la testa della lista.
aaa
25/01/15 12:46
Sguaraus
provando qualche modifica sono riuscito a leggere QUASI correttamente il file (devo sistemare un attimo le dimensioni di scorta e costo)

nelle fread al posto di sizeof() ho messo la lunghezza dei campi della struttura
es. nome[50]

fread(prodotto.nome, 50, 1, fp);
Ultima modifica effettuata da Sguaraus 25/01/15 12:49
aaa