Sviluppo di BASIC_IO

Questo modulo deve incapsulare le funzioni che permettono di leggere e scrivere su file; in questo caso su due file particolari, uno di nome ingresso.txt per la lettura ed uno di nome uscita.txt per la scrittura.
Il file di input viene letto una riga per volta e tale riga è poi immagazzinata in un array, da cui si leggeranno i singoli caratteri.
Il modulo utilizza le seguenti variabili globali, il cui uso è completamente incapsulato al suo interno.
#define DIM 200  /* massima lunghezza di una linea del file di input*/

char linea_corrente[DIM];  /* contenuto della linea corrente*/

int finito = FALSE, 
    /* vero quando il file è finito (la linea corrente ` l'ultima)*/
    puntatore; /* individua il carattere corrente nella linea corrente*/

FILE *INP, *OUT; /* nomi interni C per il file di input e di output*/
Sviluppiamo ora le varie funzioni che appaiono nell'interfaccia del modulo.
Scrittura di un carattere
void Scrivi_Car(char c)
/*scrive il carattere c sul file `uscita.txt'*/
{
    fputc(c,OUT);
}
Andare a capo sul file di output
void A_Capo_Scrittura(void)
/*avanza la scrittura sul file uscita.txt alla riga successiva*/
{
    fputc('\n',OUT);
}
Andare a capo sul file di input
void A_Capo_Lettura(void)
/*avanza la lettura sul file ingresso.txt alla riga successiva*/
{
    Recupera_Linea();
}
utilizza la funzione ausiliaria
void Recupera_Linea(void)
{
    int i, c, j;

    for(i = 0; i < DIM && (c = fgetc(INP)) != EOF && c != '\n'; i++)
        linea_corrente[i] = c;
    if(c == EOF) finito = TRUE;
    linea_corrente[i] = '\0';
    puntatore = 0;
}
Guarda il prossimo carattere
char Guarda_Car(void)
/*ritorna il prossimo carattere sul file ingresso.txt,
  non avanza la lettura
  se la linea è finita ritorna '/0'*/
{        
    return linea_corrente[puntatore];
}
Prende il prossimo carattere
char Leggi_Car(void)
/*ritorna il prossimo carattere sul file ingresso.txt,
  avanza la lettura
  se la linea è finita va a capo*/
{    
    if(linea_corrente[puntatore] != '\0'){
         return linea_corrente[puntatore++];
     }
     else 
         if(! finito){
             Recupera_Linea();
             return Leggi_Car();
         }
         else
            printf("ERRORE: tentato di leggere sul file vuoto\n");
}
Avanza fino ad un dato carattere
void Salta(char c)
/*avanza la lettura sul file ingresso.txt fino a superare 
  la prossima occorenza di c, si assume che ci sia */
{
    while(Guarda_Car() != c)
        Leggi_Car();
    Leggi_Car();
}
Salta gli spazi
void Salta_Blanks(void)
/*avanza la lettura sul file ingresso.txt fino a raggiungere 
  il primo carattere diverso dal ' ' sulla linea corrente,
  altrimenti raggiunge la fine della linea  */
{
    while(Look_Car() ==' ') Leggi_Car();
}
Inizializzazione e fine
I file deveono essere aperti per la lettura e la scrittura e poi richiusi, queste operazioni vengono fatte da due procedure (funzioni) appropriate che andranno chiamate rispettivamente come prima e come ultima cosa nel main del programma.
void Inizializza(void)
{
    INP = fopen("ingresso.txt","r");
    OUT = fopen("uscita.txt","w");
    Recupera_Linea();
}

void Smobilita(void)
{
    fclose(INP);
    fclose(OUT);
}
A questo punto abbiamo sviluppato due file che faranno parte del programma, l'interfaccia e il body di questo modulo: BASIC_IO.h e BASIC_IO.c.