[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.