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