ARRAY:
	- Struttura omogenea (contiene elementi dello stesso tipo) e finita (ha una dimensione definita)

STRUCT:
	- Struttura non omogenea (può contenere elementi di tipi diversi) e finita (ha una dimensione definita)

FILE:
	- Struttura omogenea (inteso come una sequenza di byte o strutture dello stesso tipo) e (virtualmente) infinita (la dimensione può crescere nel tempo fino ai limiti del file)



File di Testo:
	- Contengono sequenze di caratteri (stringhe)
	- Sono facilmente leggibili (contengono lettere, numeri e segni di punteggiatura)
	- Possono essere letti e modificati facilmente con un editor
	- Occupano molto spazio su disco
	- Possono essere di tipo .html, .xml, .xsl, .txt, etc.

File Binari:
	- Contengono sequenze di byte o di strutture
	- Non è possibile saltare in una posizione specifica (vengono quindi lette tutte le righe del file)
	- Non sono leggibili direttamente dall’uomo
	- Possono essere di tipo .doc, .xls, .ppt, .bin, .dat, .exe, etc.

File BMP
	- Sono File Binari che memorizzano immagini raster
	- Contengono una testata con le informazioni sull’immagine (dimensioni, profondità di colore, etc.)
	- I dati dell’immagine descrivono ogni pixel (posizione e colore)
	- Occupano molto spazio su disco non essendo compressi (o comunque vengono compressi in modo semplice)
	- Vengono utilizzati per immagini ad alta qualità e fedeltà visiva
	- L’estensione tipica è .bmp

La testa dei File BMP è composta da:
	- BITMAPFILEHEADER
		o È la prima struttura del File BMP
		o Contiene informazioni generali come il tipo del file (char bfType[2]), la dimensione totale del file (int bfSize), l’offset dove iniziano i dati dell’immagine (pixel) (int bfOffBits), e contiene anche due byte riservati, ovvero che sono nulli (int bfReserved)
	- BITMAPINFOHEADER
		o Viene subito dopo la prima testata
		o Specifica i dettagli come la larghezza e l’altezza dell’immagine, il numero di bit per pixel, il metodo di compressione, la dimensione dei dati dell’immagine, la risoluzione e la palette dei colori usata dall’immagine



FILE * fopen(const char * filename, char * mode);
	filename: nome del file
	mode:	r (sola lettura del file; il file deve esistere)
		w (sola scrittura del file; se il file non esiste lo crea, se esiste lo svuota)
		a (scrive nel file a partire dalla fine; se il file non esiste lo crea)
		r+ (legge/aggiorna il file; posso aprire il file in lettura, e nel caso modificarlo)
		w+ (scrive/aggiorna il file; se il file esiste non lo svuota)
		a+ (scrive a partire dalla fine/aggiorna il file)

mode può concludersi specificando il tipo di file su cui si sta lavorando:
	- t (text): specifica che il file su cui si sta lavorando è un File di Testo (se non viene specificato è di default)
	- b (binary): specifica che il file su cui si sta lavorando è un File Binario

int fclose(FILE * file);
	- Non si può fare la fclose() di un puntatore nullo (restituisce 0 oppure -1 se in errore)

int fputc(char ch, FILE * fp);
	- Scrittura del carattere chr su fp (file di testo)

char * fgets(char * str, int size, FILE * fp);
	- Lettura di una stringa str da fp (file di testo)

int fputs(char * str, FILE * fp);
	- Scrittura di una stringa str su fp (file di testo)

int fscanf(FILE * fp, const char * format, ...);
	- Lettura formattata da fp (file di testo), restituisce il numero di elementi letti

int fprintf(FILE * fp, const char * format, ...);
	- Scrittura formattata su fp (file di testo), restituisce il numero di elementi scritti

void rewind(FILE * fp);
	- Riposizionamento all'inizio (azzeramento posizione testina di lettura/scrittura), ignorata in caso di file aperto

int fflush(FILE * fp);
	- Forza la scrittura dei dati bufferizzati sullo stream. Se fp vale NULL, forza tutti i buffer aperti in scrittura. Restituisce 0/EOF (ma normalmente non si chiama mai)
					  
int rename(char * old, char * new);
	- Rinomina un file

int remove(char * filename);
	- Cancella il file filename (restituisce 0 se l'operazione è riuscita)

void perror(char * str);
	- Stampa il messaggio con la descrizione dell'errore dell'ultimo errore che c'è stato

size_t fread(void * ptr, size_t size, size_t count, FILE * fp);
	- Leggi su un File Binario

size_t fwrite(const void * ptr, size_t size, size_t count, FILE * fp);
	- Scrive su un File Binario

int fseek(FILE * fp, long offset, int origin);
origin:
	o SEEK_SET (sposta la posizione del puntatore all’inizio del file)
	o SEEK_CUR (sposta la posizione del puntatore alla posizione corrente)
	o SEEK_END (sposta la posizione del puntatore alla fine del file)
offset è il numero di byte da spostare rispetto a origin

long ftell(FILE * fp);
	- Restituisce la posizione corrente del puntatore di lettura/scrittura in un file. Può essere usata per determinare la dimensione del file o per verificare la posizione nel file durante la lettura/scrittura.
