Archivi sequenziali in C++. Esercizi di cancellazione e modifica di un record.

Si consideri il file anagrafica.csv della fig. [1] seguente, ottenuto dall’esportazione nel formato CSV della tabella del foglio di lavoro di Excel della fig. [2]. Si tratta dello stesso file di esempio utilizzato in un altro articolo (link articolo), questa volta però vogliamo realizzare la cancellazione e la modifica di un record di cui si fornisce la posizione.

csv-c

Si fa notare che il file anagrafica.csv è un file di testo che contiene record a lunghezza variabile: ogni sua riga è un record i cui campi sono separati con un carattere punto e virgola. Esso quindi ha un’organizzazione sequenziale, pertanto, sappiamo (link articolo) presenta forti limitazioni sulle operazioni che possono essere eseguite su di esso.

La cancellazione di un record

La cancellazione di un record del file non può essere eseguita operando direttamente e solo ed esclusivamente sul file. In generale, la cancellazione di un record all’interno di un archivio può realizzarsi o attraverso una più efficiente  cancellazione logica, che consiste nel marcare il record da cancellare con la scrittura di un prefissato carattere (o di un’opportuna sequenza di caratteri) in un campo fissato del record; oppure attraverso una cancellazione fisica, che consiste nella riscrittura di tutti i record successivi a quello da cancellare, a partire dalla sua posizione. In questo caso nessuno dei due tipi di cancellazione è realizzabile, in quanto un record può essere scritto solo o a partire dall’inizio del file, con perdita di tutto il suo contenuto, o aggiungendolo in coda a quelli già esistenti.

L’unico modo di procedere può essere quello di riscrivere l’intero file in un file di appoggio, secondo lo schema della figura seguente, e alla fine cancellare il vecchio file e rinominare il file di appoggio con il nome del vecchio file.

cancellazione

Ciò può essere ottenuto in C++ con il seguente codice:

La modifica di un record

Anche in questo caso, la possibilità di scrittura solo in coda (append) fa si che la modifica di un record del file possa avvenire solo riscrivendo l’intero file, utilizzando un file di appoggio secondo lo schema della figura seguente.

modifica

Ciò può essere ottenuto in C++ con il seguente codice: