Laboratorio di Algoritmi

Documenti analoghi
Programmazione (imperativa)

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

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

Operazioni su file di caratteri

Corso di Informatica A.A

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

LIBRERIE STANDARD in C Le librerie standard

File binari e file di testo

Formattazione avanzata. Modificatori di formato in output Modificatori di formato in input Stream predefiniti

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

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

Laboratorio di Programmazione

Gestione dei File. Credits Prof. Campi

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

Gestione dei file in C

Streams e disk files

Gestione dei file in C

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

Sommario FONDAMENTI DI INFORMATICA 1. Il tipo FILE. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

Lezione 22: Input/Output e Files

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

INPUT E OUTPUT DI VALORI NUMERICI

Settimana n.12. Obiettivi File!di!testo. Contenuti Concetto!di!file!e!funzioni! fopen/fclose Funzioni!fgets+sscanf Approfondimenti!su!printf! e!

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

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

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

Lezione 7: Funzioni e gestione dei File

Input/Output di numeri

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

Ingresso ed Uscita in C. Informatica 1 / 15

I/O Avanzato in C: scheda riassuntiva

ELEMENTI DI INFORMATICA. Linguaggio C

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

I files (archivi) Il C definisce in stdio.h tre file aperti automaticamente: stdin, stdout e stderr.! Sono ad accesso sequenziale diretto

Laboratorio di Algoritmi

Scrittura formattata - printf

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri

Introduzione al linguaggio C Primi programmi

file fisico file logico

Introduzione alla programmazione in linguaggio C

Files in C endofile

Ingresso ed Uscita in C. Luca Abeni

Caratteri e stringhe

Librerie C. Corso di Linguaggi e Traduttori 1 AA Corso di Linguaggi e Traduttori 1 AA stdio.h

Introduzione al C. Stream e disk file

Linguaggio C: i file

C O P Y R I G H T ( C ) W W W. F O N D A M E N T I. I N F O

C: panoramica. Violetta Lonati

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

Librerie C. Corso di Linguaggi e Traduttori 1 AA

Caratteri e stringhe

Il linguaggio C. Breve panoramica su stdio.h

Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2007/08 Tutor: Barbara Pettazzoni

Dati due punti sul piano calcolare la loro distanza

Perché usare UniversiBO?

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 6 Marzo 2016

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 21 Maggio 2014

STRINGHE: ARRAY DI CARATTERI! a p e \0

Lezione 11: Liste a Puntatori e Input/Output

RIPRENDIAMO I PUNTATORI

I files in C. A cura del prof. Ghezzi

FONDAMENTI DI INFORMATICA. Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI. Facoltà di Ingegneria Università degli Studi di Udine

Linguaggio C. Vettori, Puntatori e Funzioni Stringhe. Università degli Studi di Brescia. Prof. Massimiliano Giacomin

Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 9 File

Cosa serve per cominciare?

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2013

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

Primi programmi in C

File e puntatori a file

Indice. La gestione dei file in C e gli stream. Apertura e chiusura di un file. Operazioni sui file. Accesso sequenziale e non sequenziale

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

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2015

Programmazione (imperativa)

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Esercitazione di Reti degli elaboratori

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Sommario ELEMENTI DI INFORMATICA. Passaggio da standard I/O. LINGUAGGIO C Gestione dei file

INPUT/OUTPUT. L'immissione dei dati di un programma e l uscita dei suoi risultati avvengono attraverso operazioni di lettura e scrittura

Lezione integrativa: Dal C++ al C

INPUT/OUTPUT INPUT/OUTPUT

1

LEZIONE 1 LE BASI DEL LINGUAGGIO C

ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI. Docente: Giorgio Giacinto AA 2008/2009. formalizzazione degli algoritmi in linguaggio C

Compendio sottoinsieme del C++ a comune col C. (Libreria standard, Input/Output, Costanti, Dichiarazioni e typedef, Memoria Dinamica)

Lezione XII.III Gestione dei file Un progetto completo

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Premessa. Input /output e gestione dei file. I file e gli stream. Il puntatore al file. 21. I FILE NEL LINGUAGGIO C Versione 1.

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

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Tipi strutturati in C. Stringhe

Transcript:

Laboratorio di Algoritmi Corso di Laurea in Matematica Roberto Cordone DI - Università degli Studi di Milano Lezioni: Martedì 8.30-10.30 in aula 3 Mercoledì 10.30-12.30 in Aula 2 Giovedì 8.30-10.30 in aula 4 Giovedì 15.30-17.30 in Aula 2 Ricevimento: su appuntamento Tel.: 02 503 16235 E-mail: roberto.cordone@unimi.it Web page: http://homes.di.unimi.it/~cordone/courses/2018-algo/2018-algo.html Lezione 3: Richiami sul linguaggio C Milano, A.A. 2017/18 1 / 1

Stringhe di caratteri Stringa è in C qualsiasi sequenza di caratteri Per rappresentarla esplicitamente, basta racchiuderla fra virgolette Esempio: "Questa e una stringa." Le variabili che conservano stringhe vanno dichiarate come vettori char s[row LENGTH]; Ne riparleremo La libreria string.h fornisce funzioni per gestire stringhe di caratteri Per poterle usare bisogna includere la libreria: #include <string.h> La funzione fornisce la lunghezza di una stringa strlen(s) 2 / 1

Copia e concatenamento Non si possono copiare stringhe con l operatore di assegnamento (=) La funzione strcpy(dest,orig) copia la stringa orig nella stringa dest il C non controlla che la stringa dest possa contenere orig: se dest è più corta, la copia eccede i limiti e sporca altri dati La funzione La funzione strncpy(dest,orig,n) copia al max. i primi n caratteri strcat(dest,add) aggiunge la stringa add in fondo alla stringa dest il C non controlla che la stringa dest possa allungarsi per l intera aggiunta di add: se dest è troppo corta, l aggiunta eccede i limiti e sporca altri dati La funzione strncat(dest,add,n) aggiunge al max. n caratteri 3 / 1

Confronto Non si possono confrontare stringhe con l operatore == strcmp(s1,s2) confronta le stringhe s1 e s2 in modo lessicografico (dizionario) 1 scorre in parallelo le due stringhe per i 0 caratteri fino a trovare due caratteri diversi (s1[i]!= s2[i]) oppure il termine di una delle due stringhe 2 restituisce valore nullo se entrambe le stringhe sono terminate valore negativo se s1 termina o s1[i] < s2[i] valore positivo se s2 termina o s1[i] > s2[i] 4 / 1

Gli stream Si dice stream qualsiasi sorgente di dati in ingresso e qualsiasi destinazione per i risultati in uscita tastiera video file su disco, CD, DVD, memorie flash dispositivi di comunicazione (porte di rete, stampanti, ecc... ) La libreria stdio.h tratta tutti gli stream allo stesso modo (per quanto possibile) rappresentandoli con puntatori a file (FILE *) su cui operano funzioni simili o identiche 5 / 1

Gli stream standard Esistono tre stream standard, che non occorre definire, aprire e chiudere lo standard input (stdin), ovvero la tastiera lo standard output (stdout), ovvero il video lo standard error (stderr), ovvero il video Quando si chiama un programma, il sistema operativo può reindirizzare gli stream standard, cioè modificarne il significato programma < nomefile indica che si ricevono i dati dal file nomefile anziché da tastiera (stdin punta il file nomefile) programma > nomefile indica che si stampano i risultati sul file nomefile anziché a video (stdout punta il file nomefile) programma 2> nomefile indica che si stampano i messaggi di errore sul file nomefile anziché a video (stderr punta il file nomefile) 6 / 1

Parsing Parsing (analisi sintattica) è il processo che analizza una data sequenza di simboli per determinarne la struttura grammaticale Questa operazione è fondamentale perché serve ad acquisire i dati del programma da uno stream in ingresso dati digitati su tastiera stringhe di caratteri file su disco altre fonti esterne Parser è un programma che esegue tale analisi non banale 7 / 1

La funzione scanf La principale funzione per il parsing di testo fornito da tastiera è int scanf(char *formato,...) ha un numero variabile di parametri (p 1) la stringa di formato definisce il pattern che si cerca di riconoscere nello stream in ingresso p 1 puntatori sono gli indirizzi delle celle dove conservare i valori riconosciuti nello stream in ingresso termina alla fine della stringa o al primo oggetto non riconosciuto restituisce il numero di oggetti del pattern ritrovati nello stream Il resto dello stream resta disponibile per la chiamata seguente 8 / 1

La stringa di formato Stringa di formato e stream in ingresso sono compatibili quando ogni carattere non separatore nella stringa, cioè diverso da spazio, a capo e tabulazione, corrisponde allo stesso carattere nello stream uno o più separatori consecutivi nella stringa corrispondono a zero o più separatori consecutivi nello stream le specifiche di conversione nella stringa (%...) corrispondono a zero o più separatori consecutivi e una sequenza di caratteri che descrive un oggetto del tipo indicato dalla specifica (numero intero, numero reale, singolo carattere, parola,... ) Esempio: La stringa di formato Numero %d/%d corrisponde allo stream Numero seguito da zero o più spazi e da due interi separati da / Quindi è compatibile con Numero3/5, Numero 15/ 2, Numero -6/ 0, ecc... Non è compatibile con Numero 10 /5 9 / 1

Specifica di conversione Indica il tipo di oggetto atteso nella posizione corrente dell ingresso %d int decimale %u unsigned int decimale %f float in notazione decimale %e float in notazione scientifica %c char %s stringa priva di separatori %[set] stringa fatta con i caratteri elencati in set Ogni puntatore indica dove copiare l oggetto corrispondente L istruzione scanf( %d/%d/%d,&giorno,&mese,&anno); cerca tre numeri interi separati da / li assegna alle variabili giorno, mese e anno restituisce il numero di interi trovati 10 / 1

Esempio Ingresso Istruzione n i j 12, 34 n = scanf( %d%d,&i,&j); 1 12 invariato 12, 34 n = scanf( %d,%d,&i,&j); 1 12 invariato 12, 34 n = scanf( %d,%d,&i,&j); 2 12 34 12, 34 n = scanf( %d, %d,&i,&j); 1 12 invariato 12, 34 n = scanf( %d, %d,&i,&j); 2 12 34 Suggerimento: si noti la posizione della virgola nella stringa di formato 11 / 1

Raffinamenti I modificatori di lunghezza alterano il tipo dell oggetto %hd %hu %ld %lu %lf %Lf short decimale unsigned short decimale long decimale unsigned long decimale double long double Un numero (larghezza massima) indica che l oggetto trovato in ingresso deve contenere un massimo numero dato di caratteri: con ingresso 2010, l istruzione scanf( %2d,&i); assegna a i il valore 20 Un asterisco (soppressore) indica che l oggetto trovato in ingresso non va assegnato ad alcun puntatore: scanf( %*d,&i); non altera i 12 / 1

Esempio Ingresso Istruzione Risultati 12 34 n = scanf( %*d%d,&i); n = 1 i = 34 Un due tre n = scanf( %*s%s,s); n = 1 s = due 12345 n = scanf( %1d%2d%3d,&i,&j,&k); n = 3 i = 1 j = 23 k = 45 123456 n = scanf( %2d%2s%2d,&i,s,&j); n = 3 i = 12 s = 34 j = 56 Si noti la mancanza della & prima di s 13 / 1

Uscita formattata int printf(char *formato,...) è la principale funzione per la stampa a video Funziona esattamente come la funzione scanf Ha un numero variabile di parametri p 1 la stringa di formato definisce un pattern che si ricostruisce in uscita p 1 oggetti dai quali la funzione trae i risultati da stampare Restituisce il numero di oggetti del pattern stampati in uscita 14 / 1

Parsing di stringhe Anche le stringhe di caratteri si possono vedere come stream e quindi si possono gestire con funzioni simili int sscanf(char *stringa, char *formato,...) riconosce nella stringa (primo parametro) gli elementi forniti dalla stringa di formato (secondo parametro) assegna gli oggetti riconosciuti ai puntatori (parametri successivi) Esempio: char s[10+1]; int giorno, mese, anno; strcpy(s, 14/05/2010 ); sscanf(s, %d/%d/%d,&giorno,&mese,&anno); sprintf genera stringhe formattate come printf stampa a video 15 / 1

Apertura di un file di testo (1) I file di testo sono costituiti da sequenze di caratteri organizzati in righe, separate dal carattere speciale \n Per usare un file occorre aprirlo con il comando che specifica FILE *fopen(char *nomefile, char *modo) il nome del file da aprire e la posizione su disco (path) il modo in cui usarlo r : in lettura, ponendosi al principio del file w : in scrittura, ponendosi al principio del file a : in accodamento, ponendosi alla fine del file Il path può essere assoluto o relativo (al file eseguibile o al progetto) 16 / 1

Apertura di un file (2) La funzione fopen restituisce un puntatore al file per poterlo usare se il file non esiste in lettura, restituisce NULL in scrittura e accodamento, ne crea uno vuoto se il file non può essere aperto o creato restituisce NULL Aperto un file, la posizione accessibile è il principio del file se si è aperto il file in lettura o scrittura la fine del file se si è aperto il file in accodamento Dopo l uso, il file va chiuso con l istruzione int fclose(file *stream) 17 / 1

Parsing di file di testo Tutti gli stream di ingresso sono gestiti allo stesso modo int fscanf(file *stream, char *formato,...) funziona come scanf, salvo richiedere il puntatore allo stream usato: interpreta il contenuto dello stream in base alla stringa di formato assegna gli oggetti riconosciuti ai puntatori che seguono restituisce il numero di oggetti assegnati Esempio: FILE *fp; int giorno, mese, anno; fp = fopen( prova.txt, r ); fscanf(fp, %d/%d/%d,&giorno,&mese,&anno); 18 / 1

Terminazione di un file Se si arriva al termine di un file la funzione fscanf restituisce il numero di oggetti assegnati se non ne ha assegnati, restituisce la costante simbolica EOF int fscanf(file *stream, char *formato,...) N.B.: fscanf restituisce EOF se si trova esattamente al termine, non se il file termina durante il parsing Dopo il fallimento di un operazione di lettura la funzione feof restituisce vero, cioè un valore intero non nullo int feof(file *stream) 19 / 1

Lettura di righe Si può leggere un intera riga da tastiera con l istruzione opera sullo stream stdin char *gets(char *s) legge una riga compreso il carattere terminale \n restituisce la stringa s escluso \n ; se fallisce, restituisce NULL Si può leggere un intera riga da file con l istruzione char *fgets(char *s, int n, FILE *stream) opera sullo stream specificato legge una riga compreso il carattere terminale \n, ma legge al massimo n caratteri e non include \n restituisce la stringa s compreso il icarattere terminale \n restituisce la stringa s; se fallisce, restituisce NULL 20 / 1

Scrittura su file int fprintf(file *stream, char *formato,...) funziona esattamente come printf e sprintf: scrive sullo stream nel formato specificato dalla relativa stringa il valore degli oggetti che seguono int *fputs(char *s, FILE *stream) scrive la stringa s sullo stream di uscita senza aggiungere \n int *puts(char *s) scrive la stringa s sullo stdout con un \n aggiuntivo Restituiscono EOF se falliscono, un valore non negativo altrimenti 21 / 1

Il main come funzione Anche il main è una funzione, chiamata dal sistema operativo ha dei dati, descritti dai parametri formali nell intestazione ha un risultato, descritto dal tipo restituito nell intestazione Tuttavia il numero e tipo dei parametri non è noto a priori il risultato è sempre intero Questo apre una serie di domande come si definisce il numero e tipo dei parametri? come si passano i parametri attuali? a che serve e come si recupera il risultato? 22 / 1

Parametri formali e attuali int main (int argc, char *argv[]) I parametri formali non sono definiti direttamente, bensì attraverso int argc, che è il numero dei parametri char *argv[], che è un vettore dinamico di lunghezza argc composto da stringhe che descrivono i parametri I parametri attuali vengono passati attraverso la linea di comando argv[0] è il nome del programma argv[1] è il primo parametro argv[2] è il secondo parametro... 23 / 1

Risultato Il risultato di un programma C è sempre un intero La libreria stddef.h definisce le costanti simboliche EXIT SUCCESS (0) da usare se il programma ha avuto successo EXIT FAILURE (-1) da usare in caso di errore Si usa specificare il tipo di errore definendo altre costanti simboliche Il valore numerico viene restituito al sistema operativo alcuni ambienti di compilazione lo indicano all utente i file batch o script lo possono usare 24 / 1