Lettura e scrittura di caratteri per leggere caratteri: getchar(void); Laboratorio di linguaggi per scrivere caratteri: putchar(int); Le molte volte l input viene bufferizzato fino al tasto ENTER 1 2 Lettura e scrittura di caratteri Lettura e scrittura di caratteri #include<ctype.h> char ch; do ch=getchar(); if(islower(ch)) ch=toupper(ch); else ch=tolower(ch); putchar(ch); while(ch!='.'); 3 4 Lettura e scrittura di caratteri Lettura e scrittura di stringhe getch(): restituisce il valore subito senza visualizzarlo getche(): restituisce il valore subito e lo visualizza riscrivendo l ultimo programma con getch() si può osservare la differenza per leggere stringhe: gets(char *) per scrivere stringhe: puts(char *) la funzione gets() legge fin si preme il tasto ENTER 5 6 1
Lettura e scrittura di stringhe char s[100]; gets(s); puts(s); prototipo: int printf(const char *str,...); restituisce il numero di caratteri scritto o un valore negativo in caso di errore str è formata da caratteri da visualizzare specificatori che definiscono il modo in cui gli argomenti successivi vengono visualizzati 7 8 per esempio printf("%d e` il %s preferito", 5, "mio numero"); produce 5 e` il mio numero preferito lo specificatore %c serve per visualizzare caratteri: printf("%c%c%c%c\n", 'c','i','a','o'); produce ciao 9 10 per definire la minima ampiezza del campo: printf("%2c%3c%4c%5c\n", 'c','i','a','o'); printf("%-2c%-3c%-4c%-5c\n", 'c','i','a','o'); produce c i a o c i a o 11 per visualizzare numeri %d o %i anche qui si può definire la minima ampiezza: #include<math.h> int i1,i2; 12 2
for(i1=2;i1<=4;i1++) for(i2=1;i2<5;i2++) printf("%d ", (int)pow(i1,i2)); printf("\n"); senza definire la minima ampiezza: 2 4 8 16 32 3 9 27 81 243 4 16 64 256 1024 con printf("%4d ",... : 2 4 8 16 32 3 9 27 81 243 4 16 64 256 1024 13 14 per visualizzare numeri in virgola mobile %f, %e, %E, %g, %G: printf("%f\n", 123.456); 123.456000 printf("%e\n", 123.456); 1.234560e+002 printf("%e\n", 123.456); %g sceglie il più breve tra %f e %e %G sceglie il più breve tra %f e %E per esempio: for(i1=1;i1<10;i1++) printf("%g\n", pow(10,i1)); produce: 1.234560E+002 15 16 10 100 1000 10000 100000 1e+006 1e+007 1e+008 1e+009 per specificare la precisione printf("%x.yf",num); visualizza num usando almeno x caratteri visualizza num con y cifre decimali si applica anche a %e e %E 17 18 3
"%f" "%12f" "%.10f" "%.5f" "%.4f" "%12.3f" "%.2f" "%2.1f" 1234.567890 1234.567890 1234.567890 1234.5678900000 1234.56789 1234.5679 1234.568 1234.57 1234.6 19 "%e" "%12e" "%.10e" "%.5e" "%.4e" "%12.3e" "%.2e" "%2.1e" 1234.567890 1.234568e+003 1.234568e+003 1.2345678900e+003 1.23457e+003 1.2346e+003 1.235e+003 1.23e+003 1.2e+003 20 per visualizzare interi in formato ottale oppure esadecimale: %o, %x, %X un esempio: for(i1=3;i1<30;i1+=3) printf("%2d %2o %2x %2X\n", i1,i1,i1,i1); produce: 21 3 3 3 3 6 6 6 6 9 11 9 9 12 14 c C 15 17 f F 18 22 12 12 21 25 15 15 24 30 18 18 27 33 1b 1B 22 per visualizzare un indirizzo: %p int i1,i2; printf("&i1: %p, &i2: %p\n", &i1,&i2); produce &i1: 0022FF64, &i2: 0022FF60 lo specificatore %n serve per sapere quanti caratteri erano gia stampati printf("quanti %ncaratteri\n", &x); printf("x: %d\n",x); produce quanti caratteri x: 7 23 24 4
per visualizzare stringhe: %s %x.ys visualizza la stringa in almeno x caratteri e senza superare y caratteri char *str="una stringa"; printf("%s\n", str); printf("<%20s>\n", str); printf("<%-20s>\n", str); printf("%5.8s\n", str); produce una stringa < una stringa> <una stringa > una stri 25 26 il modificatore * serve per definire la minima ampiezza e la precisione tramite argomenti del printf: double y=123.456; printf(" %*.*f, %*.*f\n", 10,2,y,5,1,y); produce 123.46, 123.5 serve per leggere valori prototipo int scanf(const char* str,...); la stringa determina il modo in cui vengono letti i valori ulteriori argomenti determinano dove vengono letti i valori 27 28 la stringa di controllo è formata da specificatori di formato spazi caratteri diverse da spazi specificatore indica il tipo dei dati specificatore: % e un carattere restituisce il numero di elementi a cui è stato assegnato un valore per leggere numeri interi di tipo int: %d o %i int x; scanf("%d",&x); printf("%d\n",x); per numeri ottali: %o per numeri esadecimali: %h 29 30 5
int x; scanf("%o",&x); printf("%d\n",x); se inserisco "23", stampa "19" int x; scanf("%o",&x); printf("%d\n",x); se inserisco "ab", stampa "171" per leggere numeri in virgola mobile di tipo float: %e,%f o %g float a; scanf("%f",&a); printf("%f\n",a); se inserisco "1.2", stampa "1.200000" se inserisco "1.1e2", stampa "110.000000" 31 32 per leggere un numero intero di tipo short: %hd, %hi, %ho o %hx per leggere un numero intero di tipo long: %ld, %li, %lo o %lx per leggere un numero in virgola mobile di tipo double: %le, %lf, %lg: double a; scanf("%lf",&a); 33 per leggere stringhe: %s char s[100]; scanf("%s",s); printf("la stringa: %s\n",s); legge solo la prima parola se inserisco "ciao", stampa "ciao" se inserisco "ciao mamma", stampa "ciao" per leggere caratteri: %c 34 si può leggere più di un valore char x,y,z; scanf("%c%c%c",&x,&y,&z); printf(" %c %c %c\n",x,y,z); se inserisco "abc", stampa "a b c" un spazio nella stringa di controllo fa saltare eventuali spazi vuoti del input senza spazi: scanf("%c%c%c",&x,&y,&z); printf(" %c %c %c\n",x,y,z); se inserisco "a b c", stampa " a c" 35 36 6
con spazi: scanf("%c %c %c",&x,&y,&z); printf(" %c %c %c\n",x,y,z); se inserisco "a b c", stampa " a b c" salta non solo spazi ma anche tabulazione e codice di fine riga caratteri diversi di spazi vengono eliminati int x,y; scanf("%d,%d",&x,&y); printf("%d,%d\n",x,y); inserisco "1,2", stampa "1,2" inserisco "1 2", stampa "1,4206592" inserisco "1, 2", stampa "1,4206592" 37 38 caratteri diversi di spazi vengono eliminati int x,y; scanf("%d, %d",&x,&y); printf("%d,%d\n",x,y); inserisco "1,2", stampa "1,2" inserisco "1 2", stampa "1,4206592" inserisco "1, 2", stampa "1,2" 39 gruppo di scansione: vengono accettati solo i caratteri del gruppo: char s1[10],s2[10]; scanf("%[abcdefghi]%s",s1,s2); printf("s1: %s, s2: %s\n",s1,s2); risultato: "ciaomam" => "s1: cia, s2: omam" "ciao mam" => "s1: cia, s2: o" "ciao_mam" => "s1: cia, s2: o_mam" 40 lunghezza massima di una stringa: char s1[10]; scanf("%5s",s1); printf("s1: %s\n",s1); risultato: "ciaomamma" => "s1: ciaom" il input è bufferizzato: se un scanf() non legge tutti i caratteri inseriti, quelli non letti vengono letti dalla prossima scanf() l'utente è chiesto di inserire soltanto quando il buffer è vuoto 41 42 7
char s1[10]; int x; scanf("%d",&x); printf("x: %d\n",x); scanf("%s",s1); printf("s1: %s\n",s1); inserisco "123 alma", stampa: x: 123 s1: alma 43 il valore restituito serve per controllare cos'è successo: int x,y,r; r=scanf("%d,%d",&x,&y); printf("r: %d, x: %d, y: %d\n", r,x,y); risultato: "1,2" => "r: 2, x: 1, y: 2" "1 2" => "r: 1, x: 1, y: 4206592" 44 I/O da un file Apertura di un file operazioni vengono effettuati tramite un puntatore a file: punta a dati che definiscono varie informazioni su un file: nome posizione all'interno del file tipo di file il tipo FILE definito in stdio.h 45 la funzione fopen() serve per aprire un file: FILE *fopen(char *nome, char *modalita); la prima stringa definisce il nome la seconda il modo in cui viene aperta il file restituisce un puntatore restituisce NULL in caso di fallimento 46 Modalità di apertura di un file Modalità di apertura di un file Modalità r w Tipo testuale testuale Per lettura scrittura Azione apre crea Modalità r+ w+ Tipo testuale testuale Per lettura/scr. lettura/scr. Azione apre crea a testuale aggiungere apre o crea a+ testuale lettura/agg. apre o crea rb binario lettura apre r+b binario lettura/scr. apre wb binario scrittura crea w+b binario lettura/scr. crea ab binario aggiungere apre o crea a+b binario lettura/agg. apre o crea 47 48 8
Apertura di un file per esempio f=fopen("prova","r"); if f non è NULL il file è aperto e possiamo leggerlo Chiusura di un file la funziona fclose() serve per chiudere un file: int fclose(file *p); esegue una chiusura formale del file la mancata chiusura può provocare perdita di dati in caso di successo il valore restituite è zero 49 50 Scrivere in un file testuale la funzione fprintf() serve per scrivere caratteri in un file: int fprintf(file *f, const char *str,...); funziona nello stesso modo come printf() il primo argomento definisce quale file vogliamo scrivere 51 Scrivere in un file testuale int i1,i2; if((f=fopen("prova","w"))==null) 52 Scrivere in un file testuale Scrivere in un file testuale for(i1=1;i1<=5;i1++) for(i2=1;i2<=5;i2++) fprintf(f," %2d ",i1*i2); fprintf(f,"\n"); viene creato un file con contenuto: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 53 54 9
Scrivere in un file testuale if((f=fopen("prova","a"))==null) fprintf(f,"bella tabella"); 55 Scrivere in un file testuale viene aggiunta la stringa alla fine del file: 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 Bella tabella 56 Leggere da un file testuale per leggere da un file testuale serve la funzione fscanf(): int fscanf(file *f, const char* str,...); funziona nello stesso modo come scanf() il primo argomento definisce quale file vogliamo leggere Leggere da un file testuale int i1,x; char s[100]; 57 58 Leggere da un file testuale Leggere da un file testuale if((f=fopen("prova","r"))==null) for(i1=1;i1<=25;i1++) fscanf(f,"%d",&x); printf("%d\n",x); fscanf(f,"%s",s); printf("%s ",s); fscanf(f,"%s",s); printf("%s",s); 59 60 10
Leggere da un file testuale legge il numeri della tabella e la ultima riga: 1 2 3... 20 25 Bella tabella La funziona feof() per sapere quando sono arrivato alla fine di un file serve la funziona feof(): int feof(file *f); restituisce 1 quando viene raggiunta la fine del file restituisce 0 altrimenti 61 62 La funziona feof() La funziona feof() char s[100]; if((f=fopen("prova","r"))==null) while(!feof(f)) fscanf(f,"%s",s); printf("%s\n",s); 63 64 La funziona feof() La funziona rewind() legge tutte le stringhe del file prova: 1 2... 20 25 Bella tabella serve per ritornare all'inizio del file: char s[100]; if((f=fopen("prova","w+"))==null) 65 66 11
La funziona rewind() La funziona rewind() fprintf(f,"%s", "Scrivo nel file"); fscanf(f,"%s",s); printf("s: %s\n",s); rewind(f); fscanf(f,"%s",s); printf("s: %s\n",s); 67 l'output: s: s: Scrivo 68 Scrivere in un file binario Scrivere in un file binario la funzione fwrite() può essere usata per scrivere in un file binario: size_t fwrite(void * buffer, size_t num_bytes, size_t count, FILE *f); argomenti di fwrite() buffer: puntatore a una regione di memoria dove si trovano i dati da scrivere num_bytes: numero di bytes di un oggetto count: numero di oggetti da scrivere f: puntatore a file dove vengono scritti i dati 69 70 Leggere da un file binario Leggere da file binario la funzione fread() può essere usata per leggere da file binario: size_t fread(void * buffer, size_t num_bytes, size_t count, FILE *f); argomenti di fread() buffer: puntatore a una regione di memoria dove i dati vengono letti num_bytes: numero di bytes di un oggetto count: numero di oggetti da leggere f: puntatore a file da dove vengono letti i dati 71 72 12
Scrivere/leggere da file binario double x=1.3,xx; long int y=100,yy; if((f=fopen("prova","wb+"))==null) 73 Scrivere/leggere da file binario fwrite(&x,sizeof(double),1,f); fwrite(&y,sizeof(long int),1,f); rewind(f); fread(&xx,sizeof(double),1,f); fread(&yy,sizeof(long int),1,f); printf("xx: %f, yy: %ld\n", xx,yy); 74 Scrivere/leggere da file binario si può leggere/scrivere strutture intere con fread() e fwrite(): typedef struct char titolo[80]; char autore[40]; int anno; libro; 75 Scrivere/leggere da file binario libro l,ll; strcpy(l.titolo,"candido"); strcpy(l.autore,"voltaire"); l.anno=1757; if((f=fopen("prova","wb+"))==null) 76 Scrivere/leggere da file binario fwrite(&l,sizeof(libro),1,f); rewind(f); fread(&ll,sizeof(libro),1,f); printf("%s: %s (%d)\n", ll.autore,ll.titolo,ll.anno); La funzione fseek() la funzione fseek() serve per spostare l'indicatore di posizione int fseek(file *f, long int numbytes, int origin); 77 78 13
La funzione fseek() posiziona rispetto al variabile origin: origin SEEK_SET SEEK_CUR SEEK_END posizione nuova inizio + numbytes posizione attuale + numbytes fine del file + numbytes 79 La funzione fseek() int i1; if((f=fopen("prova","wb+"))==null) for(i1=1;i1<=10;i1++) fwrite(&i1,sizeof(int),1,f); 80 La funzione fseek() La funzione fseek() fseek(f,3*sizeof(int),seek_set); fread(&i1,sizeof(int),1,f); printf("%d ",i1); fseek(f,-4*sizeof(int),seek_end); fread(&i1,sizeof(int),1,f); printf("%d\n",i1); fseek(f,4*sizeof(int),seek_cur); fread(&i1,sizeof(int),1,f); printf("%d ",i1); 81 82 La funzione fseek() l'ouput: 4 9 7 SEEK_SET SEEK_SET+3*4 SEEK_SET-4*4 SEEK_END 1 2 3 4 5 6 7 8 9 10 SEEK_CUR SEEK_CUR+4*4 83 14