Salve a tutti, ho un problema con questo programma, in pratica è un database generale dove puoi inserire codice numerico, nome e quantità dei prodotti i quali vengono salvati in una lista concatenata, quando si inserisce il codice ("q") per uscire dal programma questo mi salva la lista in un file. Al riavvio del programma c'è un blocco di codice simile che mi rilegge la lista dal file e se vado a stamparla mi escono i prodotti che aveva salvato precedentemente ma mi esce anche una serie di numeri e lettere senza senso, ogni volta che riavvio il programma c'è una struttura in più con numeri a caso.
Codice
codice:
#include <stdio.h>#include <stdlib.h>
#include "readline.h"


#define NAME_LEN 25
#define FILE_NAME "inventory_save.bin"


struct part {
  int number;
  char name[NAME_LEN+1];
  int on_hand;
  struct part *next;
};


struct part *inventory = NULL;


struct part *find_part(int number);
void insert(void);
void search(void);
void update(void);
void print(void);
void save(FILE *fp);


int main(void)
{
  char code;
  FILE *fp = fopen(FILE_NAME, "rb");
  struct part *new_node;


  while(!feof(fp)){
    if(fp == NULL){
        fprintf(stderr, "I dati non possono essere caricati\n\n");
        break;
    }
    if((new_node = malloc(sizeof(struct part))) == NULL){
        printf("\nNon e' stato possibile caricare i dati\n");
        break;
    }
    fread(new_node, sizeof(struct part), 1, fp);
    new_node->next = inventory;
    inventory = new_node;
  }


  printf("***Database prodotti generali***\n\n");


  for(;;){
    printf("Inserisci un codice: ");
    scanf(" %c", &code);
    while (getchar() != '\n')
      ;
    switch (code) {
      case 'i': insert();
                break;
      case 'r': search();
                break;
      case 'u': update();
                break;
      case 'p': print();
                break;
      case 'q': save(fp);
                break;
      default:  printf("Codice errato\n");
    }
    printf("\n");
  }
}


struct part *find_part(int number)
{
  struct part *p = inventory;


  for(; p != NULL && number > p->number; p = p->next)
    ;
  if(p != NULL && number == p->number){
    return p;
  }
  return NULL;
}


void insert(void)
{
  struct part *new_node, *cur, *prev;


  if((new_node = malloc(sizeof(struct part))) == NULL){
    printf("Il database e' pieno, non e' possibile aggiungere altri componenti.\n");
    return;
  }


  printf("Inserisci il codice dell componente: ");
  scanf("%d", &new_node->number);


  for(prev = NULL, cur = inventory; cur != NULL && new_node->number > cur->number; prev = cur, cur = cur->next)
    ;


  if(cur != NULL && new_node->number == cur->number){
    printf("Il componente %d esiste gia'.\n", new_node->number);
    free(new_node);
    return;
  }


  printf("Inserisci il nome dell componente: ");
  read_line(new_node->name, NAME_LEN);


  printf("Inserisci la quantita': ");
  scanf("%d", &new_node->on_hand);


  new_node->next = cur;
  if(prev == NULL){
    inventory = new_node;
  }else{
    prev->next = new_node;
  }
}


void search(void)
{
  int number;
  struct part *p;


  printf("Inserisci il codice dell componente: ");
  scanf("%d", &number);


  p = find_part(number);


  if (p != NULL) {
    printf("Nome componente: %s\n", p->name);
    printf("Quantita' disponibili: %d\n", p->on_hand);
  } else
    printf("Componente non trovato.\n");
}


void update(void)
{
  int number, change;
  struct part *p;


  printf("Inserisci il codice dell componente: ");
  scanf("%d", &number);
  p = find_part(number);
  if (p != NULL) {
    printf("Inserisci la quantita' da scalare: ");
    scanf("%d", &change);
    p->on_hand += change;
  } else
    printf("Componente non trovato.\n");
}


void print(void)
{
  struct part *p;


  printf("Codice componente\t\tNome componente\t\tDisponibilita'\n");
  for (p = inventory; p != NULL; p = p->next){
    printf("%7d\t\t\t%-.25s\t    %11d\n", p->number, p->name, p->on_hand);
  }
}


void save(FILE *fp){
    fclose(fp);
    if((fp = fopen(FILE_NAME, "wb")) == NULL){
        fprintf(stderr, "Non è possibile salvare i dati.\n");
        return;
    }


    for (struct part *p = inventory; p != NULL; p = p->next){
        fwrite(p, sizeof(struct part), 1, fp);
    }


    exit(EXIT_SUCCESS);
}
Cattura.PNG
ho caricato questa cattura per farvi capire meglio.