C27 – Soluzione esercizio

Avatar Paolo Godino
/****************************************************************************************************************

Il file binario "prodotti.dat" contiene le informazioni sui prodotti in magazzino di un negozio: ogni prodotto è 
descritto da una stringa descrizione formata da 20 caratteri compreso il terminatore e un intero quantità. 

Scrivere un programma che, dopo aver letto il file e salvato il numero di record a disposizione, permetta 
all'utente di modificare un elemento nel file, cioè il main deve:
    - chiedere all'utente la posizione dell'elemento da modificare nel file e il nuovo prodotto da inserire al 
      posto del precedente. Deve quindi modificare direttamente il record nel file, non utilizzando cioè un 
      array di strutture ma spostandosi nella posizione richiesta e inserendo il nuovo prodotto;
    - stampare tutti i record dall'inizio del file fino a quello appena modificato (incluso). 
      Per fare ciò occorre riposizionarsi all'inizio del file.

*****************************************************************************************************************/
#include <stdio.h>

#define TOT_RECORD 3

typedef struct {
    char descrizione[20];
    int quantita;
} prodotto_t;

void createFile() {
    FILE* pFile;
    prodotto_t prodotti[20];
    
    pFile = fopen("prodotti.dat", "wb");
    if (pFile) {
        for (int n=0; n<20; ++n) {
            snprintf(prodotti[n].descrizione, sizeof(prodotti[n].descrizione), "Prodotto%02d", n+1);
            prodotti[n].quantita = (n+1) * 5;
        }
        
        fwrite(&prodotti, sizeof(prodotto_t), 20, pFile);
        
        fclose(pFile);
    } else {
        printf("Errore apertura file in scrittura\n");
    }
}

int ottieneNumeroRecord(FILE* fp) {
    fseek(fp, 0, SEEK_END);
    return ftell(fp) / sizeof(prodotto_t);
}

void stampaFinoAPos(FILE* fp, int pos) {
    prodotto_t p;
    
    rewind(fp);
    
    for (int i=0; i<pos; ++i) {
        fread(&p, sizeof(prodotto_t), 1, fp);
        printf ("Descrizione: %s    Quantità: %d\n", p.descrizione, p.quantita);
    }
}

void cambiaRecord(FILE* fp, int num_records) {
    int pos;
    prodotto_t p;
    
    printf("Numero del record da modificare 1..%d: ", num_records);
    scanf("%d", &pos);
    
    printf("inserisci la descrizione del prodotto sostitutivo: ");
    scanf("%s", p.descrizione);
    printf("inserisci la quantità del prodotto sostitutivo: ");
    scanf("%d", &p.quantita);
    
    fseek(fp, (pos-1)*sizeof(prodotto_t), SEEK_SET);
    fwrite(&p, sizeof(prodotto_t), 1, fp);
    
    stampaFinoAPos(fp, pos);
}

int main() {
    FILE* pFile;
    int num_record;
    
    //createFile();
    
    pFile = fopen("prodotti.dat", "rb+");
    if (!pFile) {
        printf("Errore apertura file\n");
        return 1;
    }
    
    
    num_record = ottieneNumeroRecord(pFile);
    printf("numero totale di record: %d\n", num_record);
    
    cambiaRecord(pFile, num_record);
    
    
    fclose(pFile);

    return 0;
}

Tagged in :

Avatar Paolo Godino

Lascia un commento