Post on 01-May-2015
PolitecnicoPolitecnicodi Milanodi Milano
EserciziEsercizi
File di testo, file binariFile di testo, file binari
- - 22 - -
I File ed il CI File ed il C
Insieme omogeneo di dati, memorizzato su disco e caratterizzato da un nomeLa lunghezza di un file non è fissata a prioriAstrazione di un file: un nastro e una testina…File di testo (sequenza di caratteri) e file binari (sequenza di byte)Il file può essere aperto o chiusoIl C, per operare su un file, deve aprire un flusso di comunicazioneI flussi chiamati stdin, stdout e stderr sono aperti per default e sono connessi al terminale (tastiera e monitor).
- - 33 - -
I file di testo: scritturaI file di testo: scrittura
fprintf (fileTesto, "%s\n", var);
p r o v a \npippo.txt
0 1 2 3 4 5
fileTesto = fopen ("pippo.txt", "w");
pippo.txt
p r o v a \0var
char var[] = "prova";
- - 44 - -
I file di testo: scritturaI file di testo: scrittura
fprintf (fileTesto, "%d ",var1);
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
int var1 = 356;
Codici ASCII dei caratteri ‘3’, ‘5’, ‘6’
var1 356
- - 55 - -
I file di testo: letturaI file di testo: lettura
fscanf (fileTesto, "%s", var);
fileTesto = fopen ("pippo.txt", "r");
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
p r o v a \0var
- - 66 - -
I file di testo: letturaI file di testo: lettura
fscanf (fileTesto, "%d", &var1);
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
Notare che il carattere ‘\n’ viene scartato
var1 356
- - 77 - -
I file di testo: scrittura I file di testo: scrittura “append”“append”
fprintf (fileTesto, "%c", var2);
fileTesto = fopen ("pippo.txt", "a");
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
p r o v a \n 3 5pippo.txt
0 1 2 3 4 5 6 7
6
8 9
@
10
char var2 = '@';
@var2
- - 88 - -
I file di testo: riepilogoI file di testo: riepilogo
Quando si scrive un dato con fprintf(), bisogna inserire un carattere terminatore che ne indichi la fine: ‘\n’, ‘\t’, ‘ ’Il carattere terminatore serve quando si utilizza la fscanf() perché quest’ultima si accorga che il dato da leggere è terminatoNel caso di “%c”, non è strettamente necessarioIl file va prima aperto, poi letto/scritto e infine chiuso apertura usando “w”, “r”, “a”.
- - 99 - -
File di testoFile di testo
L’utente inserisce una serie di numeri float; il numero 0 indica la fine della fase di inserimentoL’elaboratore scrive i numeri in un file di testo, usando due cifre decimali I numeri sono letti dal file, nell’ordine di inserimento, e visualizzati.
- - 1010 - -
File di testoFile di testo
#include <stdio.h>void scriviInFile (char nomeFile[]){
const float TERMINATORE = 0.0;FILE *fileDiTesto;float numero;fileDiTesto = fopen (nomeFile, "w");printf ("Numero: ");scanf ("%f", &numero); while (numero != TERMINATORE){
fprintf (fileDiTesto, "%.2f\n", numero);printf ("Numero: ");scanf ("%f", &numero);
}fclose (fileDiTesto);
} .
- - 1111 - -
File di testoFile di testo
void leggiDaFile (char nomeFile[]){
FILE *fileDiTesto;float numero;
fileDiTesto = fopen (nomeFile, "r");fscanf (fileDiTesto, "%f", &numero);while (!feof(fileDiTesto)){
printf ("Numero: %.2f\n", numero);fscanf (fileDiTesto, "%f", &numero);
}fclose (fileDiTesto);
} .
- - 1212 - -
File di testoFile di testo
void main(){
char nomeArchivio[] = "C:\\pippo.txt";
scriviInFile (nomeArchivio);leggiDaFile (nomeArchivio);
}
Perché salvare numeri in un file di testo?Si può fare (converte i numeri in “stringhe di testo”)Il file sarà leggibile da programmi tipo notepadNon è però molto comune (vedi file binari)
- - 1313 - -
File di testoFile di testo
- - 1414 - -
I file binari: scritturaI file binari: scrittura
fwrite (&var, sizeof(float), 1, fileBin);
fileBin = fopen ("pippo.xxx", "wb");
pippo.xxx
float var = 23.45;
var 23.45
pippo.xxx
0 1 2 3
23.45
- - 1515 - -
I file binari: letturaI file binari: lettura
fread (&var, sizeof(float), 1, fileBin);
fileBin = fopen ("pippo.xxx", "rb");
pippo.xxx
0 1 2 3
23.45
pippo.xxx
0 1 2 3
23.45
var 23.45
- - 1616 - -
I file binari: fseek() e ftell()I file binari: fseek() e ftell()
fseek (fileBin, sizeof(float)*2, SEEK_SET);
long n; n = ftell (fileBin);
12n
4 5 6 7
pippo.xxx
0 1 2 3
23.45 425.025
8 9 10 11
125.521
4 5 6 7
pippo.xxx
0 1 2 3
23.45 425.025
8 9 10 11
125.521
- - 1717 - -
I file binari: vettori e stringheI file binari: vettori e stringhe
fwrite (vet, sizeof(vet), 1, fileBin);
fileBin = fopen ("pluto.xxx", "wb");
pluto.xxx
int vet[2];vet[0] = 15;vet[1] = 23;
15 23vet
pluto.xxx
0 1 2 3
15 23
- - 1818 - -
Lettura/scrittura di blocchi di byteTipicamente, tutti i blocchi hanno la stessa dimensioneNon serve carattere terminatore perché indico io alla fread() quanti byte deve leggereAnche qui il file va prima aperto, poi letto/scritto e infine chiuso apertura usando “wb”, “rb”, “ab” Istruzioni per spostarsi all’interno del file: fseek() e per sapere in quale posizione sono: ftell()fseek() e ftell() possono essere usate anche con file di testo ma sono meno utili.
I file binari: riepilogoI file binari: riepilogo
- - 1919 - -
Archivio rilevamenti geograficiArchivio rilevamenti geografici
Il programma dovrà permettere all’utente di inserire una serie di rilevamenti geografici (latitudine e longitudine). L’inserimento di una latitudine pari a 100 indicherà la fine della fase di inserimentoL’elaboratore salverà i dati in un file binarioSuccessivamente l’utente inserirà una latitudine e l’elaboratore, cercando nel fine, troverà e visualizzerà tutti i rilevamenti caratterizzati da quel valore di latitudineInfine, l’elaboratore visualizzerà il numero di rilevamenti trovati.
- - 2020 - -
#include <stdio.h>typedef struct{
unsigned int latitudine;unsigned int longitudine;
} Rilevamento;
void inserisci (char nomeFile[]){
const unsigned int TERMINATORE = 100; FILE *archivio; Rilevamento nuovoRilev;
archivio = fopen (nomeFile, "wb"); printf ("Latitudine (100 per finire): "); scanf ("%u", &nuovoRilev.latitudine); .
Archivio rilevamenti geograficiArchivio rilevamenti geografici
- - 2121 - -
Archivio rilevamenti geograficiArchivio rilevamenti geografici
if (nuovoRilev.latitudine != TERMINATORE) {
printf ("Longitudine: ");scanf ("%u", &nuovoRilev.longitudine);
} while (nuovoRilev.latitudine != TERMINATORE) {
fwrite (&nuovoRilev, sizeof(Rilevamento), 1, archivio);
printf ("Latitudine (100 per finire): "); scanf ("%u", &nuovoRilev.latitudine); .
- - 2222 - -
if (nuovoRilev.latitudine != TERMINATORE) { printf ("Longitudine: ");
scanf ("%u",&nuovoRilev.longitudine); } } /* fine while */ fclose (archivio);} /* fine inserisci() */
unsigned int cerca (char nomeFile[], unsigned int latidCercata){
FILE *archivio; Rilevamento rilev; unsigned int cont = 0; .
Archivio rilevamenti geograficiArchivio rilevamenti geografici
- - 2323 - -
archivio = fopen (nomeFile, "rb"); fread (&rilev, sizeof(Rilevamento), 1, archivio); while (!feof(archivio)) {
if (rilev.latitudine == latidCercata) {
printf ("Latitudine: %u\n", rilev.latitudine);
printf ("Longitudine: %u\n", rilev.longitudine); cont++;
}fread (&rilev, sizeof(Rilevamento), 1,
archivio); }
fclose (archivio); return cont;}
Archivio rilevamenti geograficiArchivio rilevamenti geografici
- - 2424 - -
void main(){ char nomeArchivio[] = "C:\\numeri.dat"; unsigned int latitudine;
inserisci (nomeArchivio); printf ("Quale latitudine? "); scanf ("%u", &latitudine); printf ("Totale: %u\n", cerca (nomeArchivio, latitudine));}
Archivio rilevamenti geograficiArchivio rilevamenti geografici
- - 2525 - -
Archivio rilevamenti geograficiArchivio rilevamenti geografici