Corso C su Raspberry PI partendo da zero: Gestire i files su disco

Un importante tassello, nella programmazione dei computer, è quello rappresentato dalla gestione dei files su disco. Con essi è possibile memorizzare stabilmente, in maniera permanente, le informazioni dell'utente e quelle elaborate dal programma. Tale possibilità esiste, praticamente, in tutti i linguaggi, ma quella offerta dal linguaggio C risulta estremamente logica e semplice. Poche funzioni, infatti, sono adibite alle operazioni che permettono di trattare, in maniera sicura, la memorizzazione dei dati su file-system. L'approccio, anche in questo caso, è reso semplice ed indolore e i parecchi esempi presenti, di grado sempre maggiore, avvicinano il programmatore a questo importante argomento dell'informatica.

Introduzione

Qualsiasi PC, si sa, è dotato di una memoria RAM di tipo volatile che, quando non è alimentata da corrente elettrica, perde tutto il suo contenuto. Agli inizi della mia esperienza informatica, diciamo quando avevo circa 10-12 anni, i personal computer non possedevano le caratteristiche di quelli dei giorni d'oggi. I primi modelli di ZX-81 e Commodore 64 non possedevano le memorie di massa (esse uscirono sul mercato qualche tempo dopo ed erano relativamente costose). In edicola si vendevano le prime riviste informatiche, nelle quali erano pubblicati chilometrici listati sorgenti da ricopiare al PC. La digitazione poteva protrarsi per alcune ore e, dopo estenuante e lungo lavoro, passato anche a correggere errori vari (proprio della rivista), il programma funzionava regolarmente.

Si avvicinava, ovviamente, il momento in cui il computer doveva essere spento. A malincuore si staccava la spina e tutto il lavoro veniva perso... Pazienza, il giorno dopo si ritornava a ripetere tutte le operazioni e a digitare, nuovamente, l'intero listato. Pazzesco.

Per fortuna, l'adozione delle memorie di massa ha tolto per sempre questo tedioso problema e, ai nostri giorni, esse possono essere considerate come dei contenitori di dati dalle enormi capacità di memorizzazione.

Il File

I dati e le informazioni possono essere inoltrate, attraverso appositi flussi, verso opportuni dispositivi, logici o fisici. Questi dispositivi sono, per esempio, una stampante, un disco, un video, un terminale, ecc. La figura 1 illustra lo schema logico dell'utilizzo dei files. Come abbiamo visto in qualche puntata precedente, in Linux, tutto è considerato un file. Qualsiasi operazione di trasporto delle informazioni, dal/al dispositivo, preclude le seguenti fasi:

  • Apertura del file;
  • Lettura o scrittura delle informazioni;
  • Chiusura del file.

Immaginiamo un file come una stanza piena di volantini di carta. Se io voglio accedere alla stanza e ai documenti in essa contenuti, devo aprire la porta (apertura del file). Quindi posso portare dentro altri volantini (operazione di scrittura) o leggerli (operazione di lettura). Alla fine del lavoro è buona norma chiudere la porta (chiusura del file) poiché un colpo di vento potrebbe far volare via tutte le carte. Il paragone calza a pennello con tale tipologia di argomentazione (Figura 1).

 

Figura 1: Schema logico.

Figura 1: Schema logico.

 

Usiamo subito i files

A differenza della stragrande maggioranza delle pubblicazioni che trattano l'accesso ai files, il nostro approccio prevede una pratica diretta al loro utilizzo. In questa maniera, invece di sorbirsi chilometriche teoriche trattazioni, si utilizzerà subito tali dispositivi e si comprenderà immediatamente l'utilità e il modo di accesso.

Tabelline a scuola

Si supponga che vostro figlio vi chieda di stampare un foglio contenente tutte le tabelline, dall'1 al 10, poiché la maestra ha lasciato tale compito per casa. Lungi dal trascrivere a mano cento righe di moltiplicazioni, vediamo come produrre un file di testo contenente l'esercizio, stampabile e visualizzabile a piacere, sia a casa che a scuola. Guardiamo, innanzitutto, il sorgente.

#include "stdio.h"
int main() {
   int i,k;
   FILE *handle;
   handle=fopen("tabelline.txt","w");
   for(i=1;i<11;i++) {
      fprintf(handle,"Tabellina del %d\n\n",i);
      for(k=1;k<11;k++)
         fprintf(handle,"%2d x %2d = %3d\n",i,k,i*k);
      fprintf(handle,"===============================\n");
   }
   fclose(handle);
   return 0;
}

 

Il calcolo delle tabelline avviene all'interno di due cicli annidati (i, k). Il primo (i) itera da 1 a 10 per processare la relativa tabellina (dell'1, del 2, ecc), il secondo (k) itera da 1 a 10 per eseguire le moltiplicazioni per tale valore (i*1, i*2, i*3, ecc). E veniamo alle funzioni e istruzioni che trattano i files:

FILE *handle;

Si tratta di una dichiarazione di variabile, posta ad inizio programma. E' un puntatore a file, ed è dichiarato nel file di inclusione "stdio.h", ma al programmatore non interessa più di tanto. Il suo scopo è quello di creare un riferimento al dispositivo, cosicché ci si può riferire ad esso per qualsiasi [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2292 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

3 Commenti

  1. Avatar photo Maurizio 1 Dicembre 2016
  2. Avatar photo Fabio 9 Dicembre 2016

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend