[1] Ciò non significa, purtroppo, che le implementazioni del C siano identiche in tutti gli ambienti. Le caratteristiche di alcuni tipi di macchina, nonché quelle di certi sistemi operativi, possono rendere piuutosto difficile realizzare ciò che in altri appare invece naturale. Ne consegue che, in ambienti diversi, non sempre la libreria standard contiene le stesse funzioni; inoltre, una stessa funzione può avere in diverse librerie caratteristiche lievemente differenti.
[2] Con redirezione DOS si intende un'operazione effettuata al di fuori del codice del programma, direttamente sulla riga di comando che lo lancia, con i simboli ">", ">>" o "<".
[3] Si tenga presente che i prototipi di tutte le funzioni operanti su stream si trovano in STDIO.H.
[4] Non è escluso che nelle librerie di qualche compilatore C la printf() sia implementata semplicemente come un "guscio" che chiama fprintf() passandole tutti i parametri ricevuti, ma preceduti da stdout.
[5] Ecco la definizione del tipo FILE data da typedef:
typedef struct {
int level;
unsigned flags;
char fd;
unsigned char hold;
int bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
} FILE;
[6] E' evidente che quel valore è l'indirizzo della struttura di tipo FILE: non ha molta importanza; per noi rappresenta lo stream. Circa la fopen() va ancora precisato che ciascuna delle stringhe di indicazione della modalità di apertura può essere modificata aggiungendo il carattere "b" o, in alternativa, "t". La "t" indica che ogni '\n', prima di essere scritto in un file, deve essere trasformato in una coppia "\r\n" e che in lettura deve essere effettuata la trasformazione opposta: tale impostazione si rivela comoda per molte operazioni su file ASCII. La "b" invece indica che il file deve essere considerato "binario", e non deve essere effettuata alcuna trasformazione. La modalità di default è, di norma, "t"; nel C Borland è definita la variabile external _fmode, che consente di specificare il default desiderato per il programma.
[7] La fclose() richiede che le sia passato come parametro lo stream da chiudere e non restituisce alcun valore. Per chiudere tutti gli stream aperti dal programma è disponibile la fcloseall(), che non richiede alcun parametro.
[8] ora una particolarità su fseek(): uno spostamento di 0 byte è il solo affidabile su stream associati a file aperti in modo text ("t"). Le funzioni di libreria dedicate agli stream non gestiscono correttamente il computo dei caratteri scritti o letti quando alcuni di essi siano eliminati dal vero flusso di dati (o aggiunti ad esso).
[9] A dire il vero, ciò vale anche per printf() e fprintf(). L'analogia tra queste funzioni è tale da fa pensare che esista anche una scanf()... ed è proprio così. La scanf() equivale ad una fscanf() chiamata passandole stdin come parametro stream.
[10] Si può affermare, anzi, che i dischi sono tra le periferiche più lente.
[11] Proviamo a chiarire: per lettura ridondante (read forwarding) si intende la lettura dal file di una quantità di byte superiore al richiesto e la loro memorizzazione in un buffer, nella "speranza" che eventuali successive operazioni di lettura possano essere limitate alla ricerca dei dati nel buffer medesimo, senza effettuare ulteriori accessi fisici al disco. La scrittura ritardata (write staging) consiste nel copiare in un buffer i dati da scrivere di volta in volta, per poi trasferirne sul disco la massima quantità possibile col minimo numero di accessi fisici.
[12] Esistono, del resto, programmi dedicati al caching dei dischi, generalmente operanti a livello di sistema operativo (ad esempio SMARTDRV.EXE, fornito come parte integrante del DOS). Inoltre non è raro il caso di dischi incorporanti veri e propri sistemi di caching a livello hardware.
[13] Lo dimostra il fatto che uno dei campi della struttura di tipo FILE è un intero contenente proprio lo handle associato al file aperto. Detto campo (che nell'implementazione C della Borland ha nome fd) può essere utilizzato come handle del file con tutte le funzioni che richiedono proprio lo handle quale parametro in luogo dello stream.
[14] Quando più personal computer sono
collegati in rete (net), alcuni di essi mettono le proprie risorse
(dischi, stampanti, etc.) a disposizione degli altri. Ciò
consente di utilizzare in comune, cioè in modo condiviso,
periferiche, dati e programmi (che in assenza della rete dovrebbero
essere duplicati su ogni macchina interessata). In questi casi
è possibile, per non dire probabile, che siano effettuati
accessi concorrenti, da più parti, ai file memorizzati
sui dischi condivisi tra computer: è evidente che si tratta
di situazioni delicate, che possono facilmente causare, se non
gestite in modo opportuno, problemi di una certa gravità.
Si pensi, tanto per fare un semplice esempio, ad un database condiviso:
un primo programma accede in lettura ad un record del medesimo;
mentre i dati sono visualizzati, un secondo programma accede al
medesimo record per modificarne il contenuto determinando così
una palese incongruenza tra il risultato dell'interrogazione della
base dati e la reale consistenza della medesima. E' evidente che
occorre stabilire regole di accesso alle risorse condivise tali
da evitare il rischio di conflitti analoghi a quello descritto.