Download - Politecnico di Milano Esercizi File di testo, file binari.

Transcript
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