# File (superiori)
## Files

La memoria RAM di un computer è una memoria volatile perché quando viene a mancare la corrente di alimentazione i dati memorizzati nella RAM vengono persi. Per conservare dei dati anche quando il computer viene spento bisogna salvarli in un file sull'hard disk che essendo un dispositivo magnetico è in grado di conservare l'informazione anche in assenza di una corrente di alimentazione. I files sono in genere divisi in due gruppi i files di testo e i file binari, quelli di testo sono codificati usando la tabella ASCII o la più recente tabella UNICODE, tutti file in formati diversi dall'ASCII/UNICODE rientrano invece nella categoria dei files binari (ad esempio file jpg, mp3, avi, ecc). Un file è semplicemente una lunga sequenza binaria che rappresenta mediante una codifica delle informazioni.
Ecco un file 010100101001001001010000001010111100101011101110100101010010 ..... se questo file fosse codificato in ASCII allora per visualizzarlo dovrei prendere i primi 8 bit e cercare nella tabella ascii il carattere corrispondente e poi ripetere la cosa per gli 8 bit successivi e così via. Se la codifica fosse diversa i primi 4 byte potrebbero essere invece un numero intero, i successivi 8 un numero di tipo double e così via.
Il grande vantaggio di usare un file di testo è che può essere letto/modificato/creato direttamente da una persona utilizzando un semplice editor di testo. Un file di testo può essere anche creato/letto/modificato tramite un programma in C ma la codifica ASCII usata per rappresentare i dati nel file richiede una traduzione (decodifica) prima di poter caricare nelle variabili del programma le informazioni del file, questa traduzione rallenta il caricamento delle informazioni contenute nel file di testo alle celle di memoria RAM usata dal programma in C per memorizzare le variabili. Un file di testo quando viene letto/scritto comporta inoltre una trasformazione/perdita di alcuni caratteri speciali che ne permettono la formattazione (spazi, carattere di fine riga ecc.), non c'è una perfetta corrispondenza fra quello che viene inviato in scrittura e quello che viene effettivamente scritto nel file e quello che viene poi letto.
I file binari sacrificano la diretta comprensione/modificabilità del loro contenuto informativo da parte di una persona (rinunciano quindi alla codifica in formato ASCII ) e in cambio ottengono una maggiore velocità nelle operazioni di scrittura/lettura del file , cioè nel trasferimento delle informazioni fra file sull' hardisk e la memoria ram dove risiedono le variabili del programma. Un programma in C che salva su un file una variabile intera memorizzata nella RAM, ne trasferisce semplicemente la sequenza binaria, che ne rappresenta il valore, sul file. La corrispondenza fra sequenza binaria della variabile è perfettamente fedele alla sequenza binaria scritta nel file.
Per usare i files qui si utilizzano i comandi del C++, che fa uso della programmazione OOP e del concetto di stream. Per anni ho usato i comandi del C per gestire i files ma poi su suggerimento d i uno studente che li riteneva più semplici sono passato ai comandi del C++ , in realtà sono semplici e potenti entrambi i metodi.
Quando si crea un file vuoto c'è un cursore di scrittura posto a zero che indica dove nel file debba avvenire la prossima (se è vuoto la prima) operazione di scrittura
quando poi si inserisce un dato questo cursore si sposta alla fine del dato appena scritto, per indicare il punto di partenza della prossima operazione di scrittura
e così via
analogamente per le operazioni di lettura, quando si apre un file esistente c'è un cursore di lettura posto a zero che indica dove nel file debba avvenire la prossima (se è appena aperto la prima) operazione di lettura,
dopo aver letto un dato il cursore si sposta automaticamente in corrispondenza della fine del dato appena letto, pronto per indicare la posizione del prossimo dato da leggere
e così via