Per rendere il tutto più chiaro vi faccio vedere il programma funzionante solo sul main. Se potreste darmi una mano a fare le 3 funzioni :
inizializzazione
lettura
scrittura
Codice:
# include <stdio.h>
# include <stdlib.h>
struct prodotti {
char * nome;
int codice;
int qta;
int prezzo;
int tot;
};
char * strdup(char *);
int strlen(char *);
int strcmp(char*,char*); //0 se uguali, >0 se 1 >2, <0 se 1<2
int main (int argc, char * argv[]) {
prodotti *magazzino[100];
int curr_posit=0;
FILE * fin, * fout;
for (int i=0;i<100;i++) { // Funzione di inizializzazione
magazzino[i]=0; //
} //
if (argc!=3) exit(1); //Controllo sugli argomenti
char buf[100]; //Qui inizia la funzione di lettura
int num_buf;
fin=fopen(argv[1],"r");
if (fin==0) {
printf("\n\nFile non aperto. Il programma verra' terminato.\n");
exit(2);
}
while (!feof(fin)) {
prodotti *temp=(prodotti *) malloc(sizeof(prodotti));
fscanf(fin,"%s",buf);
temp->nome=strdup(buf);
fscanf(fin,"%i",&num_buf);
temp->codice=num_buf;
fscanf(fin,"%i",&num_buf);
temp->qta=num_buf;
fscanf(fin,"%i",&num_buf);
temp->prezzo=num_buf;
//temp caricato
//confronto se esiste già per aggiornare i precedenti
int trovato=0;
for (int i=0;magazzino[i]!=0;i++) {
if (strcmp(magazzino[i]->nome,temp->nome)==0 && (magazzino[i]->codice==temp->codice)) {
magazzino[i]->qta+=temp->qta;
free (temp);
trovato=1;
break;
}
}
if (trovato!=1) magazzino[curr_posit++]=temp; //Se non è stato trovato aggiungo la struttura all'array.
}
fclose(fin);
//Fine leggi!
// Inizio funzione di scrittura
fout=fopen(argv[2],"w");
if (fout==0) {
printf("\n\nFile non aperto. Il programma verra' terminato.\n");
exit(2);
}
int j=0;
int totmerci=0;
for (j=0;j<curr_posit;j++) {
fprintf(fout,"%s ",magazzino[j]->nome);
fprintf(fout,"%i ",magazzino[j]->codice);
fprintf(fout,"%i ",magazzino[j]->qta);
fprintf(fout,"%i\n",magazzino[j]->prezzo);
totmerci+=magazzino[j]->qta*magazzino[j]->prezzo;
}
fprintf(fout,"Valore totale delle merci: %i",totmerci);
fclose(fout);
printf("Elaborazione completata");
// Fine funzione di scrittura
system("PAUSE");
return 0;
}
int strlen(char *str) {
int i;
for (i=0;str[i]!='\0';i++)
{}
return i;
}
char * strdup(char *str) {
int i,lung=strlen(str);
char *temp=(char *)malloc(sizeof(char)*lung);
for (i=0;i<lung;i++) {
temp[i]=str[i];
}
temp[i]='\0';
return temp;
}
int strcmp(char *str1,char *str2) {
int i=0;
int l1=strlen(str1),l2=strlen(str2);
if (l1>l2) {
for (i=0;i<l2;i++) {
if (str1[i]<str2[i]) return -1;
else if (str1[i]>str2[i]) return 1;
else continue;
}
return 1;
}
else for (i=0;i<l1;i++) {
if (str1[i]<str2[i]) return -1;
else if (str1[i]>str2[i]) return 1;
else continue;
}
if (l1==l2) return 0;
else return -1;
}