Politecnico di Milano Esercizi File di testo, file binari.

25
Politecnico Politecnico di Milano di Milano Esercizi Esercizi File di testo, file binari File di testo, file binari

Transcript of Politecnico di Milano Esercizi File di testo, file binari.

Page 1: Politecnico di Milano Esercizi File di testo, file binari.

PolitecnicoPolitecnicodi Milanodi Milano

EserciziEsercizi

File di testo, file binariFile di testo, file binari

Page 2: Politecnico di Milano Esercizi File 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).

Page 3: Politecnico di Milano Esercizi File di testo, file binari.

- - 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";

Page 4: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 5: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 6: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 7: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 8: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 9: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 10: Politecnico di Milano Esercizi File di testo, file binari.

- - 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);

} .

Page 11: Politecnico di Milano Esercizi File di testo, file binari.

- - 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);

} .

Page 12: Politecnico di Milano Esercizi File di testo, file binari.

- - 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)

Page 13: Politecnico di Milano Esercizi File di testo, file binari.

- - 1313 - -

File di testoFile di testo

Page 14: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 15: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 16: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 17: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 18: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 19: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 20: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 21: Politecnico di Milano Esercizi File di testo, file binari.

- - 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); .

Page 22: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 23: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 24: Politecnico di Milano Esercizi File di testo, file binari.

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

Page 25: Politecnico di Milano Esercizi File di testo, file binari.

- - 2525 - -

Archivio rilevamenti geograficiArchivio rilevamenti geografici