typedef struct movimento { int datacontabile; // formato YYYYMMDD int datavaluta; // formato YYYYMMDD char descrizione[30]; float dare; float avere; struct movimento *next; } t_movimento;
t_movimento *importa(char *nomefile) { t_movimento *lista = NULL; FILE *fcsv; fcsv= fopen(nomefile,"r"); if(fcsv!=NULL) { // elemento precedente nello scorrimento della lista t_movimento *prec = NULL; int i=0; int dc, dv; float d,a; char des [30]; char *titolo; // lettura prima riga con nomi dei campi fscanf(fcsv,"%[^;];%[^;];%[^;];%[^;];%[^;];", titolo, titolo, titolo, titolo, titolo); while(fscanf(fcsv,"%d;%d;%[^;];%f;%f;", &dc, &dv, des, &d, &a) != EOF) { t_movimento *ptr= (t_movimento*) malloc (sizeof(t_movimento)); ptr->datacontabile = dc; ptr->datavaluta = dv; strcpy( ptr->descrizione ,des); ptr->dare = d; ptr->avere = a; ptr->next = NULL; printf("DEBUG:: elemento: data %d datavaluta %d dare %f, avere %f\n", dc, dv, d,a); if (i == 0) { // caso particolare per il primo elemento letto che è // anche il primo elemento della lista lista = ptr; prec = lista; } else { // il nuovo elemento letto è inserito in append (in coda) prec->next = ptr; prec = ptr; } i++; } } fclose(fcsv); return lista; }
void stampa(t_movimento *lista) { t_movimento *p = lista; while(p != NULL) { printf("movimento\ndata contabile %d\n data valuta %d\ndescrizione %s\n dare %f\navere %f\n\n", p->datacontabile,p->datavaluta, p->descrizione,p->dare,p->avere); p = p->next; } }
t_movimento *ricerca(t_movimento *lista, int data) { // movimento ricercato, se c'è t_movimento *movimento = NULL; t_movimento *p = lista; int trovato = 0; while((trovato == 0) && (p != NULL)) { if (p->datacontabile == data) { trovato = 1; movimento = p; } p = p->next; } return movimento; }
t_movimento *ultimo(t_movimento *lista) { t_movimento *prossimo = NULL; if (lista != NULL) { prossimo = lista; while(prossimo->next != NULL) { prossimo = prossimo->next; } } return prossimo; } void inserimento(t_movimento *lista, int datacontabile, int datavaluta, char *descrizione, float dare, float avere) { t_movimento *nuovo = (t_movimento *) malloc(sizeof(t_movimento)); nuovo->datacontabile = datacontabile; nuovo->datavaluta = datavaluta; // potrebbe dare problemi se la descrizione introdotta // eccede il limite di 30 caratteri strcpy(nuovo->descrizione,descrizione); nuovo->dare = dare; nuovo->avere = avere; nuovo->next = NULL; t_movimento *fine = ultimo(lista); fine->next = nuovo; }
void cancellazione(t_movimento *lista, int data) { t_movimento *prec = NULL; t_movimento *prossimo = lista; if (lista != NULL) { int b = 0; while((prossimo != NULL) && (b == 0)) { if (prossimo->datacontabile == data) { b = 1; } else { prec = prossimo; prossimo = prossimo->next; } } if (b == 1) { if (prec != NULL) prec->next = prossimo->next; else l = prossimo->next; free(prossimo); } } }
void esportaCSV(t_movimento *lista, char *nomefile) { if (nomefile != NULL) { if (strlen(nomefile) > 0) { FILE *f = fopen(nomefile, "w"); // prima riga con nomi campi fprintf(f, "datacontabile;datavaluta; descrizione;dare;avere;"); t_movimento *p = lista; while (p != NULL) { fprintf(f, "%d;%d;%s;%f;%f;", p->datacontabile, p->datavaluta, p->descrizione, p->dare, p->avere); p = p->next; } fclose(f); } } }
void esportaBIN(t_movimento *lista, char *nomefile) { if (nomefile != NULL) { if (strlen(nomefile) > 0) { FILE *f = fopen(nomefile, "wb"); t_movimento *p = lista; while (p != NULL) { fwrite(p, sizeof(t_movimento), 1, f); p = p->next; } fclose(f); } } }