Sommario. Manipolazione sequenziale di file in C Funzioni di base per I/O di file

Documenti analoghi
I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

Scrittura formattata - printf

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Input/Output di numeri

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Capitolo 11 Elaborazione di file

I File. Il file e` l'unita` logica di memorizzazione dei dati su memoria di massa.

Introduzione al C. Unità 9 File. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

file fisico file logico

L accesso ai dispositivi esterni (tastiera, monitor, file,...) viene gestito mediante canali di comunicazione.

Fondamenti di Informatica T. Linguaggio C: File

Gestione dei File. dischi nastri cd

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Input/output in C e in C++

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

GESTIONE DEI FILE IN C

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori

Un file è un astrazione di memorizzazione di dimensione potenzialmente illimitata (ma non infinita), ad accesso sequenziale.

I file possono essere manipolati (aperti, letti, scritti ) all interno di programmi C. dischi nastri cd

Funzioni di I/O per numeri. Input e output di valori numerici. Input formattato scanf. Stream preesistenti

Esercizi. I File ed il C

Stringhe e allocazione dinamica della memoria

Introduzione al C. Stream e disk file

Linguaggio C Gestione File

Introduzione al Linguaggio C

Se vogliamo cambiarlo: i dati vengono sovrascritti. 300 White Jones (vecchio valore) 300 Worthington 0.00

Esercizi File Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Linguaggio C: i file

SmallShell Piccolo processore comandi

Gestione dei file. File di testo e binari

Sistemi Operativi Teledidattico

Puntatori a funzione. In C è possibile utilizzare dei puntatori a funzioni, ovvero

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

LP1 Lezione 13: i File in C. Maurizio Tucci

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Struttura dati FILE. Concetto di FILE

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Caratteri e stringhe

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

CAPITOLO2 PROGRAMMA: PRINTING UN GIOCO DI PAROLE FONDAMENTI DI C FORMA DI UN SEMPLICE PROGRAMMA COMPILAZIONE E LINKING. directive

Librerie C. Corso di Linguaggi e Traduttori 1 AA

Gestione dei file. Linguaggio ANSI C Input/Output - 13

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

Il File-System. I file in ambiente Linux Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Gestione dei File in C

Linguaggio C La libreria standard

Laboratorio di Algoritmi e Strutture Dati

Sulla libreria standard, III. Manipolare file con stdio.h

IL PRIMO PROGRAMMA IN C

I File. File. File di testo. Esempi di file di testo. Gestione di file in C. Gestione di file in C

FILE: tipo operazione Istruì. prototipo esempi lettura di un carattere fgetc Int fgetc(file *flusso) Vedi sotto

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Le funzioni, e le istruzioni di input/output

Espressione di chiamata di funzione

Sono file di caratteri, organizzati in linee. Ogni linea e` terminata da una marca di fine linea (newline, cara ttere '\n').

puntatori Lab. Calc. AA 2007/08 1

Directory. Le directory unix sono file.

Suggerimenti, note utili ed errori comuni. Fondamenti di informatica T

Gestione dei File C. Generalità

Sistemi Operativi (M. Cesati)

Esercitazione 6. Array

$QDOLVLGHOSURJUDPPDTXDGUDWR

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Fondamenti di Informatica e Laboratorio T-AB Ingengeria dell Automazione a.a. 2008/2009. Lab 04 Input/Output

SOMMARIO SU LETTURA E SCRITTURA (I/O) DEGLI STANDARD FILES

Struttura dati FILE. Motivazioni: memorie a confronto

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

caratteri, immagini, suoni, ecc.

FILE BINARI FILE BINARI

STRINGHE: ARRAY DI CARATTERI! a p e \0

Capitolo 5 - Funzioni

È possibile definire vettori di qualunque tipo Possiamo, quindi, anche avere vettori di stringhe Ad esempio:

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

Esercitazione 3. Espressioni booleane I comandi if-else e while

FILE BINARI. I file di testo non sono indispensabili: sono semplicemente comodi 1

Funzioni e. Alessandra Giordani Mercoledì 16 maggio 2012

Introduzione al C. Unità 8 Stringhe

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Gestione di files Motivazioni

Fondamenti di Informatica. Tecniche di input/output per l'accesso ai file

Linguaggio C - Funzioni

Es 1. Scrivere un programma che verifica se una terna di numeri interi e' pitagorica

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

GESTIONE DEI FILE IL CONCETTO DI FILE APERTURA E CHIUSURA DI UN FILE OPERARE SUI FILE

GESTIONE DEI FILE persistenza archiviare file astrazione fornita dal sistema operativo dimensione potenzialmente illimitata ad accesso sequenziale

DOTT. ING. LEONARDO RIGUTINI DIPARTIMENTO INGEGNERIA DELL INFORMAZIONE UNIVERSITÀ DI SIENA VIA ROMA SIENA UFF

MAGAZZINO.CPP January 2, 2008 Page 1

Tipo carattere. Campo di variabilità. Intervallo finito. Tipo. Dimensione (byte) char

Primo passo: il preprocessor. Il preprocessore. Esempi di direttive al preprocessore: #include. Esempi di direttive al preprocessore: #define

Struttura dei programmi C

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

SOLUZIONE ESERCIZIO 1

Transcript:

File Input/Output 1

Sommario Manipolazione sequenziale di file in C Funzioni di base per I/O di file 2

Manipolazione di file I file devono essere aperti prima dell uso Associa un puntatore a file a ogni file Modi: read, write, o append Le funzioni di I/O usano il puntatore e non il nome del file Bisogna chiudere il file al termine dell uso Funzioni di base: fopen(), fclose(), fscanf(), fprintf() 3

Esempio di file I/O Scrivi un programma che: riceve in input una lista di nomi da un file chiamato names.lst conta il numero di nomi nella lista chiede un voto per ogni nome della lista produce come output il nome e il voto corrispondente nel file names_marks.dat 4

File I/O (Header) Passo 0: Includi stdio.h #include <stdio.h> int main()... return 0; 5

File I/O (File Pointer) Passo 1: Dichiara un puntatore a file (o file handler) come FILE * per ogni file int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL;... return 0; 6

File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; 7

File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; Nome del file inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; 8

File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; Modo r : read w : write a : append inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; Attenzione: Il modo "w" sovrascrive il file, se esiste 9

File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; Associa un puntatore ad ogni file da usare 10

File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1;... return 0; 11

File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo. int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1; Il puntatore vale NULL se fopen() non ha aperto il file per qualche motivo... return 0; 12

File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1;... return 0; Termina il programma In caso d errore 13

File I/O (Input) Passo 4a: Usa fscanf() per l input #include <stdio.h> #define MAXLEN 100 int main() FILE *inputfile = NULL; char name[maxlen]; int count; listnames.c 14

File I/O (Input) Passo 4a: Usa fscanf() per l input /* Assumendo che "names.lst" contenga una lista di nomi, apri questo file in lettura. */ inputfile = fopen("names.lst", "r"); listnames.c if (inputfile == NULL) printf("error opening names file.\n"); return 1; 15

File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); printf("\nnumber of names read: %d\n", count); return 0; 16

File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Vuole il puntatore a file, non il nome printf("\nnumber of names read: %d\n", count); return 0; 17

File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Gli altri parametri sono gli stessi della scanf() printf("\nnumber of names read: %d\n", count); return 0; 18

File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); fscanf() restituisce il numero di item in input convertiti e assegnati con successo printf("\nnumber of names read: %d\n", count); return 0; 19

File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Controlla se è avvenuto un errore di lettura, di assegnamento o se e stata raggiunta l EOF del file di input printf("\nnumber of names read: %d\n", count); return 0; 20

File I/O (Output) Passo 4b: Usa fprintf() per l output #include <stdio.h> #define MAXLEN 100 listnames2.c int main() FILE *inputfile = NULL; FILE *outfile = NULL; char name[maxlen]; int count; float mark; /* Assumendo che "names.lst" contenga una lista di nomi, apri questo file in lettura. */ inputfile = fopen("names.lst", "r"); if (inputfile == NULL) printf("error opening names file.\n"); return 1; 21

File I/O (Output) Passo 4b: Usa fprintf() per l output /* Il file di output "names_marks.dat conterra la lista dei nomi e dei voti corrispondenti. */ outfile = fopen("names_marks.dat", "w"); listnames2.c if (outfile == NULL) printf("error opening output file.\n"); return 1; 22

File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** etc ***/ listnames2.c 23

File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** etc ***/ Vuole il puntatore al file, non il nome listnames2.c 24

File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** etc ***/ Gli altri parametri sono gli stessi della printf() listnames2.c 25

File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** etc ***/ fprintf() restituisce il numero di caratteri scritti con successo, o un numero negativo in caso di errore listnames2.c 26

File I/O (Close) Passo 5: Chiudi ogni file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; 27

File I/O (Close) Passo 5: Chiudi ogni file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; Vuole il puntatore al file, non il nome 28

File I/O (Close) Passo 5: Chiudi un file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; Libera il buffer di input Svuota il buffer di output fclose() fallisce quando il file non è stato aperto correttamente 29

Note sui nomi di file Se non specificato altrimenti, il programma cercherà il file nella directory corrente Directory path nel nome del file: Windows sysfile = fopen( C:\\win\\system.ini, r ); Directory path nel nome del file: Unix passfile = fopen( /usr/etc/passwd, r ); 30

Note sui nomi di file Nome di file come variabile: FILE *outfile = NULL; char somename[max_name_len]; printf( Please enter output filename: ); scanf( %s, somename); outfile = fopen(somename, w ); 31

.. e come costante: Note sui nomi di file FILE *outfile = NULL; outfile = fopen( ThisName, w ); 32

File I/O e Stream Uno stream serve come canale per trasportare caratteri tra device di I/O e programmi Stream standard: stdin, stdout, stderr Un file handler/pointer serve come uno stream per/da un file Una volta che un item è letto da un input stream, la posizione nel file si muove automaticamente e l item successivo (se presente) diventa disponibile per la lettura ( accesso sequenziale") 33

Note su stringhe e fscanf() Lettura di una stringa: fscanf(stream, %s, string) Legge una sola parola" alla volta Le parole sono separate da uno spazio bianco: (space, tab, newline o loro combinazioni) Si muove alla parola successiva nello stream automaticamente dopo ogni lettura scanf( %s, string) Simile (l input stream è stdin) 34

Controllo per EOF Sia scanf() sia fscanf() restituiscono il numero di item in input convertiti e assegnati con successo il valore costante EOF se non viene letto alcun valore o quando si incontra la fine del file, quindi... Non raccomandabile! count = 0; while ( fscanf(inputfile, "%s", name)!= EOF ) count++; printf("%d. %s\n", count, name); 35

Controllo per EOF Attenzione! Usa EOF con cautela! Può causare problemi se gli specificatori di conversione non corrispondono al contenuto del file.. while ( fscanf(inpf, "%s %f", name, &mark)!= EOF ) printf("%s\t %f\n", name, mark); listmarks.c Esempio: inpf: Jake absent 36

Controllo per EOF.. infatti potrebbe leggere correttamente il primo ma non il secondo e quindi restituire 1 (non EOF) e quindi non segnalare l occorsa anomalia while ( fscanf(inpf, "%s %f", name, &mark)!= EOF ) printf("%s\t %f\n", name, mark); listmarks.c Esempio: inpf: Jake absent 37

Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo sia uguale al numero di item atteso while ( fscanf(inpf, "%s %f", name, &mark) == 2 ) printf("%s\t %f\n", name, mark); listmarks.c 38

Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo sia uguale al numero di item atteso if ( scanf("%d %d %d", &page, &row, &col)!= 3 ) printf( "I cannot go on without 3 integers :-( \n" ); exit(1); testscanf1.c 39

Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo La funzione exit() porta il programma a terminare immediatamente sia uguale al numero di item atteso if ( scanf("%d %d %d", &page, &row, &col)!= 3 ) printf( "I cannot go on without 3 integers :-( \n" ); exit(1); 40

Deitel & Deitel Capitolo 11: fino a 11.5 compreso Da sapere che esiste in alternativa all accesso sequenziale, l accesso diretto: 11.6 11.9 41

File Input/Output 10/08/06 1

08/10/06 Sommario Manipolazione sequenziale di file in C Funzioni di base per I/O di file 10/08/06 2

08/10/06 Manipolazione di file I file devono essere aperti prima dell uso Associa un puntatore a file a ogni file Modi: read, write, o append Le funzioni di I/O usano il puntatore e non il nome del file Bisogna chiudere il file al termine dell uso Funzioni di base: fopen(), fclose(), fscanf(), fprintf() 10/08/06 3

08/10/06 Esempio di file I/O Scrivi un programma che: riceve in input una lista di nomi da un file chiamato names.lst conta il numero di nomi nella lista chiede un voto per ogni nome della lista produce come output il nome e il voto corrispondente nel file names_marks.dat 10/08/06 4

08/10/06 File I/O (Header) Passo 0: Includi stdio.h #include <stdio.h> int main()... return 0; 10/08/06 5

08/10/06 File I/O (File Pointer) Passo 1: Dichiara un puntatore a file (o file handler) come FILE * per ogni file int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL;... return 0; 10/08/06 6

08/10/06 File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; 10/08/06 7

08/10/06 File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; Nome del file inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; 10/08/06 8

08/10/06 File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; Modo r : read w : write a : append inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; Attenzione: Il modo "w" sovrascrive il file, se esiste 10/08/06 9

08/10/06 File I/O (Open) Passo 2: Apri i file usando fopen() int main() FILE *inputfile = NULL; FILE *outputfile = NULL; FILE *currentfile = NULL; inputfile = fopen( Names.txt, r ); outputfile = fopen( marks.dat, w ); currentfile = fopen( logfile.txt, a );... return 0; Associa un puntatore ad ogni file da usare 10/08/06 10

08/10/06 File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1;... return 0; 10/08/06 11

08/10/06 File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo. int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1;... return 0; Il puntatore vale NULL se fopen() non ha aperto il file per qualche motivo 10/08/06 12

08/10/06 File I/O (Error Check) Passo 3: Controlla se l apertura ha avuto successo int main() FILE *inputfile; inputfile = fopen( Names.txt, r ); if (inputfile == NULL) printf( Unable to open input file.\n ); return 1;... return 0; Termina il programma In caso d errore 10/08/06 13

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input #include <stdio.h> #define MAXLEN 100 int main() FILE *inputfile = NULL; char name[maxlen]; int count; listnames.c 10/08/06 14

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input /* Assumendo che "names.lst" contenga una lista di nomi, apri questo file in lettura. */ listnames.c inputfile = fopen("names.lst", "r"); if (inputfile == NULL) printf("error opening names file.\n"); return 1; 10/08/06 15

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); printf("\nnumber of names read: %d\n", count); return 0; 10/08/06 16

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Vuole il puntatore a file, non il nome printf("\nnumber of names read: %d\n", count); return 0; 10/08/06 17

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Gli altri parametri sono gli stessi della scanf() printf("\nnumber of names read: %d\n", count); return 0; 10/08/06 18

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); fscanf() restituisce il numero di item in input convertiti e assegnati con successo printf("\nnumber of names read: %d\n", count); return 0; 10/08/06 19

08/10/06 File I/O (Input) Passo 4a: Usa fscanf() per l input listnames.c /* Leggi ogni nome e tieni il conto di quanti nomi ci sono nel file. */ count = 0; while ( fscanf(inputfile, "%s", name) == 1 ) count++; printf("%d. %s\n", count, name); Controlla se è avvenuto un errore di lettura, di assegnamento o se e stata raggiunta l EOF del file di input printf("\nnumber of names read: %d\n", count); return 0; 10/08/06 20

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output #include <stdio.h> #define MAXLEN 100 listnames2.c int main() FILE *inputfile = NULL; FILE *outfile = NULL; char name[maxlen]; int count; float mark; /* Assumendo che "names.lst" contenga una lista di nomi, apri questo file in lettura. */ inputfile = fopen("names.lst", "r"); if (inputfile == NULL) printf("error opening names file.\n"); return 1; 10/08/06 21

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output listnames2.c /* Il file di output "names_marks.dat conterra la lista dei nomi e dei voti corrispondenti. */ outfile = fopen("names_marks.dat", "w"); if (outfile == NULL) printf("error opening output file.\n"); return 1; 10/08/06 22

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** etc ***/ listnames2.c 10/08/06 23

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; Vuole il puntatore al file, non il nome /*** 10/08/06 etc ***/ listnames2.c 24

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); Gli altri parametri return 1; sono gli stessi della /*** 10/08/06 etc ***/ 25 printf() listnames2.c

08/10/06 File I/O (Output) Passo 4b: Usa fprintf() per l output /* Leggi ogni nome, chiedi il voto e scrivi nome e voto nel file di output. Inoltre, conta quanti nomi ci sono in un file. */ fprintf() restituisce il numero di caratteri scritti con successo, o un numero negativo in caso di errore count = 0; while ( fscanf(inputfile, "%s", name ) == 1 ) count++; printf("enter mark for %s: ", name); scanf("%f", &mark); if ( fprintf(outfile, "%s %f\n", name, mark) <= 0 ) printf("error writing to output file.\n"); return 1; /*** 10/08/06 etc ***/ 26 listnames2.c

08/10/06 File I/O (Close) Passo 5: Chiudi ogni file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; 10/08/06 27

08/10/06 File I/O (Close) Passo 5: Chiudi ogni file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; Vuole il puntatore al file, non il nome 10/08/06 28

08/10/06 File I/O (Close) Passo 5: Chiudi un file con fclose() int main() /*** etc ***/ printf("\n"); printf("number of names read: %d\n", count); fclose(inputfile); fclose(outfile); return 0; Libera il buffer di input Svuota il buffer di output fclose() fallisce quando il file non è stato aperto correttamente 10/08/06 29

08/10/06 Note sui nomi di file Se non specificato altrimenti, il programma cercherà il file nella directory corrente Directory path nel nome del file: Windows sysfile = fopen( C:\\win\\system.ini, r ); Directory path nel nome del file: Unix passfile = fopen( /usr/etc/passwd, r ); 10/08/06 30

08/10/06 Note sui nomi di file Nome di file come variabile: FILE *outfile = NULL; char somename[max_name_len]; printf( Please enter output filename: ); scanf( %s, somename); outfile = fopen(somename, w ); 10/08/06 31

08/10/06 Note sui nomi di file.. e come costante: FILE *outfile = NULL; outfile = fopen( ThisName, w ); 10/08/06 32

08/10/06 File I/O e Stream Uno stream serve come canale per trasportare caratteri tra device di I/O e programmi Stream standard: stdin, stdout, stderr Un file handler/pointer serve come uno stream per/da un file Una volta che un item è letto da un input stream, la posizione nel file si muove automaticamente e l item successivo (se presente) diventa disponibile per la lettura ( accesso sequenziale") 10/08/06 33

08/10/06 Note su stringhe e fscanf() Lettura di una stringa: fscanf(stream, %s, string) Legge una sola parola" alla volta Le parole sono separate da uno spazio bianco: (space, tab, newline o loro combinazioni) Si muove alla parola successiva nello stream automaticamente dopo ogni lettura scanf( %s, string) 10/08/06 34 Simile (l input stream è stdin)

08/10/06 Controllo per EOF Sia scanf() sia fscanf() restituiscono il numero di item in input convertiti e assegnati con successo il valore costante EOF se non viene letto alcun valore o quando si incontra la fine del file, quindi... Non raccomandabile! count = 0; while ( fscanf(inputfile, "%s", name)!= EOF ) count++; printf("%d. %s\n", count, name); 10/08/06 35

08/10/06 Controllo per EOF Attenzione! Usa EOF con cautela! Può causare problemi se gli specificatori di conversione non corrispondono al contenuto del file.. while ( fscanf(inpf, "%s %f", name, &mark)!= EOF ) printf("%s\t %f\n", name, mark); listmarks.c Esempio: inpf: Jake absent 10/08/06 36

08/10/06 Controllo per EOF.. infatti potrebbe leggere correttamente il primo ma non il secondo e quindi restituire 1 (non EOF) e quindi non segnalare l occorsa anomalia while ( fscanf(inpf, "%s %f", name, &mark)!= EOF ) printf("%s\t %f\n", name, mark); listmarks.c Esempio: inpf: Jake absent 10/08/06 37

08/10/06 Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo sia uguale al numero di item atteso while ( fscanf(inpf, "%s %f", name, &mark) == 2 ) printf("%s\t %f\n", name, mark); listmarks.c 10/08/06 38

08/10/06 Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo sia uguale al numero di item atteso if ( scanf("%d %d %d", &page, &row, &col)!= 3 ) printf( "I cannot go on without 3 integers :-( \n" ); exit(1); 10/08/06 39 testscanf1.c

08/10/06 Controllo per EOF Per controllare l end-of-file (o qualunque altro input error), controlla che il numero di item convertiti e assegnati con successo La funzione exit() porta il programma a terminare immediatamente sia uguale al numero di item atteso if ( scanf("%d %d %d", &page, &row, &col)!= 3 ) printf( "I cannot go on without 3 integers :-( \n" ); exit(1); 10/08/06 40

08/10/06 Deitel & Deitel Capitolo 11: fino a 11.5 compreso Da sapere che esiste in alternativa all accesso sequenziale, l accesso diretto: 11.6 11.9 10/08/06 41