Università dell Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea Informatica Anno Accademico 2007/08 Laboratorio di Lguaggi lezione XI: I/O Marco Tari Prtf Scrittura formattata t prtf( o [, lista parametri] Scrittura formattata carattere'\n': End Of Le (accapo t x=10; prtf("il valore di x e' \n", x; è un format tag : Scrive sullo schermo: significa, scrivi il valore di un parametro tero Il valore di x e' 10 Scrittura formattata t x=10, y=0; prtf("posizione [,]! ", x, y; Scrive sullo schermo: Posizione [10,0]! Vi ricordate che 'a' e 121 sono entrambi costanti (literals di tipo char? Usando il format tag appropriato, posso far scrivere uno o l'altro: char ch='a'; prtf("posso scrivere o a piacare! ", ch, ch; Scrive sullo schermo: Posso scrivere a o 96 a piacere! 1
%u %x %X %o terpreta il parametro come: un tero con segno un tero senza segno un numero virgola mobile un carattere una strga un puntatore un array di caratteri termato da '\0' %u %x %X %o terpreta il parametro come: un tero con segno un tero senza segno un base numero otto (es. virgola 16473 mobile un carattere esadecimale (es. 12AC3A una esadecimale strga (es. 12ac3a un decimale puntatore %#u %#x %#X %#o terpreta il parametro come: un tero con segno un tero senza segno un base numero otto (es. virgola 016473 mobile un carattere esadecimale (es. 0X12AC3A una esadecimale strga (es. 0x12ac3a un decimale puntatore terpreta il parametro come: un tero con segno un numero virgola mobile notazione esponenziale (es. un 1.2e12 carattere (es. una 1.2E12 strga un notazione puntatorecomune Esempio prtf("scrivo e!\n\nah!\n", 1, 2, 3; Esempio prtf("scrivo %5d %5d e %5d!\n\nah!\n", 1, 2, 3; "5 caratteri di lunghezza" Scrivo 1 2 e 3 Scrivo 1 2 e 3 ah! ah! 2
etc +: specifica il segno anche se pos l: è un "float lungo", cioè un double etc prtf("scrivo: %+6.3lf e anche %+.0e\n", 1.1, 1.2 ; 6 cifre tutto 3 cifre dopo virgola char* strga= "Totale ( euro: "; t res; prtf("\n", strga, res ; Scrivo: +1.100 e anche +1e+000 Totale ( euro: 130 Avvertenza: attenzione ai tipi Avvertenza: attenzione ai tipi prtf("torna %f euro\n", 150 ; prtf("torna %f euro\n", 150 ; Sullo schermo: Torna 0 euro Sullo schermo: Torna 0 euro Errore! Ha terpretato un valore tero come un float! Se i due tipi hanno dimensione diversa, può anche causare un crash (errore di accesso lettura. Avvertenza: attenzione ai tipi Funzionamento di prtf Come si scrive un programma che ci dice quale e' il codice ascii del simbolo '!'? t x=150; prtf("torna %f euro\n", x ; Sullo schermo: E se lo vogliamo esadecimale? Torna 0 euro 3
Funzionamento di prtf Come si scrive un programma che risolve il quiz del banner misterioso? char msg[]= {78,111,119,32,72,105,110,103,0; testo del quiz Dove scrive prtf? sull' output standard di solito, significa sul monitor ma, ad esempio al momento di eseguire il programma posso utilizzare il la stassi: programma> file Scrivere non solo sullo schermo Esempio con sprtf t prtf( [, lista param.] t fprtf( FILE* stream, [, lista param.] t sprtf( char* output, [, lista param.] prtf: scrive sull'output standard fprtf: scrive su un File sprtf: scrive su un'altra Strga (che deve essere già allocata concatenazione di strghe char[] strga1 = "cacio"; char[] strga2 = "cavallo"; char *concat; sprtf(concat,"",strga1, strga2; NON vi eravate accorti dell'errore?! Esempio con fprtf scrittura un file FILE* : il puntatore a una struttura che contiene tutto quello che c'è da sapere su un file aperto. Cosa contiene questa struttura? Non importa! (è platform dependent Gestiamo i file utilizzando solo puntatori a questa struttura fopen : apri un file. resitutisce un FILE* (alloca la struttura & apre il file Primo parametro: nome del file Secondo parametro: strga con 1-read o write o append, 2- modotesto o bario Restituisce NULL se non è riusicto ad aprire il file float x,y,z; FILE* file_di_output= fopen ("ciao.txt", "wt"; fprtf( file_di_output,"(%f %f %f",x,y,z ; fclose(file_di_output; fclose : chiudi un file. (chiude il file & disalloca la struttura solo un certo numero di files può essere aperto un dato momento consente ad altre applicazioni di usare il file 4
da prtf a per leggere dalla tastiera vece che scrivere sul monitor t x; prtf("", & x; ora vuole un puntatori! (perche? deve essere un puntatore a qualcosa di allocato ( questo esempio, è allocato automaticamente e' ancora + importante che il tipo del puntatore corrisponda al format tag! (errori scrittura vece che lettura, fa più male Tutto il resto come prtf Restituisce il numero di target tag che è stato corettamente assegnato t x,y, n; unsigned t z; n = ("-:%X", &x, &y, &z; n sarà uguale a 3 se l'utente avrà digitato, ad esempio:5-5:a0a111 n sarà uguale a 2 se l'utente avrà digitato, ad esempio:5-5pippo n sarà uguale a 0 se l'utente avrà digitato, ad esempio:>:-p Leggere non solo dalla tastiera Tutto il resto come prtf Restituisce il numero di target tag che è stato corettamente assegnato t g,m,a; do { prtf("serisci giorno/mese/anno:" ; while ( ("%u/%u/%u", &g, &m, &a!=3 ; t ( [, lista punt.] t f( FILE* stream, [, lista punt.] t s( char* put, [, lista punt.] : legge dall'put standard f: legge da un File s: legge da una Strga Esempio di f Input Output float x,y,z; output put FILE* file_di_output= fopen ("ciao.txt", "wt"; fprtf( file_di_output,"(%f %f %f",x,y,z ; da/a termale prtf fclose(file_di_output; da/a strghe sprtf s FILE* file_di_put= fopen ("ciao.txt", "rt"; f( file_di_put,"(%f %f %f",&x,&y,&z ; fclose(file_di_put; da/a files fprtf f 5
Uso tipico di s : Lettura degli argomenti da riga di comando di un programma. Per provare il programma su Dev-C++ Impostare gli argomenti su Dev-C++ numero di argomenti + 1 argv[0] : nome del programma argv[1] : primo argomento argv[argc-1] : ultimo argomento 21 t ma(t argc, char *argv[] argv[1] argv[0] argv[2] C:> pippo.exe a o:zap Uso tipico di s (compito per casa: Input Output /* mostra le isturzioni di uso da riga di comando */ void show_usage({ output put t ma(t argc, char *argv[] { t x; if (argc<2 { /* nessun argomento: mostra l'aiuto e esci */ show_usage(; return 0; if (sprtf("", argv[1], &x!= 1 { /* il primo argomento non e' un numero: mostra l'aiuto e esci */ show_usage(; return 0; da/a termale da/a strghe prtf sprtf s /* mostra i byte che compongono il numero base 16. Due cifre a byte, separate da uno spazio es: 00 00 00 01 */ return 1; da/a files fprtf f Gestione files Files bario o modo testo? FILE* file_di_output= fopen ("ciao.txt", "wt"; /* uso il file scrittura */ fclose(file_di_output; FILE* file_di_output= fopen ("ciao.txt", "rt"; /* uso il file lettura */ fclose(file_di_output; Bario: veloce platform dependent cubi di compatibilità se si leggono files scritti con una architettura differente di solito più cociso Modo testo: più lento platform dependent file comprensibili (leggibili "umano" come testo 6
Gestione files Scrittura e lettura non formattate fwrite o fread ( void* p, t size_elem, t n_elem, FILE* f scrivono/leggono ( bario sul file restituiscono il numero di elementi scritti/letti sono operatori efficienti Gestione files tutte le funzioni per leggere e scrivere su files fwrite fprtf fread f leggono e scrivono dalla posizione corrente che viene aggiornata come effetto collaterale Gestione files la posizione corrente: e' un long t puo' essere letta long t ftell(file *fp; puo' essere cambiata: t fseek(file *fp, long t offset, SEEK_SET ; t fseek(file *fp, long t offset, SEEK_CUR ; t fseek(file *fp, long t offset, SEEK_END ; o anche, riportata all'izio del file: t rewd (FILE *fp ; 7