/****************************************************************************************************************
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;
}
C27 – Soluzione esercizio
Share with
Tagged in :




Lascia un commento
Devi essere connesso per inviare un commento.