Altre istruzioni di I/O - PowerPoint PPT Presentation

1 / 26
About This Presentation
Title:

Altre istruzioni di I/O

Description:

Altre Istruzioni di I/O Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni tra cui scanf e printf che, come abbiamo gi ... – PowerPoint PPT presentation

Number of Views:34
Avg rating:3.0/5.0
Slides: 27
Provided by: PieroDem
Category:
Tags: altre | istruzioni

less

Transcript and Presenter's Notes

Title: Altre istruzioni di I/O


1
INFORMATICAAltre Istruzioni di I/O
2
Funzioni di I/O
  • Per la lettura e la scrittura da videoterminale
    il C prevede numerose istruzioni tra cui scanf e
    printf che, come abbiamo già visto, agiscono su
    tutti i tipi di dato semplici.
  •  
  • scanf e printf sono in realtà funzioni di tipo
    int e, come tali, ritornano un valore intero
    attraverso il loro nome.
  • La scanf restituisce il numero di parametri letti
    correttamente se la si richiama con un unico
    parametro (si intende leggere un solo dato), il
    valore restituito è 1 se la lettura è andata a
    buon fine, 0 in caso di errore.
  • La printf restituisce invece il numero di bytes
    che ha inviato in output, oppure 0 in caso di
    errore.

3
Funzioni di I/O
  • Nel seguente frammento di programma
  • int ndati, dato
  • .......
  • ndati scanf (d, dato)
  • in ndati verrebbe restituito il valore 1.
  • Nella lettura di dati da tastiera non è previsto
    alcun codice particolare per segnalare il fatto
    che i dati in ingresso sono finiti.
  •  
  • Generalmente per questo evento si una
    combinazione particolare di caratteri ad esempio
    i tasti CTRL (control) e Z (che il Sistema
    Operativo interpreta come valore particolare
    chiamato EOF e definito internamente).

4
Esempio
  • Programma che calcola il valor medio di un certo
    numero di dati reali (non noto a priori)
    terminanti con EOF, introdotti da terminale.
  •  
  • include ltstdio.hgt
  • define VERO 1
  • define FALSO 0
  • float numero, somma, media
  • int numdati, stato
  • int fine_lettura
  •  
  • main()
  • fine_lettura FALSO
    / inizializza flag, /

5
Esempio
  • somma 0.0
    / accumulatore risultato /
  • numdati 0 /
    contatore dei dati introdotti /
  • printf ("Introduci i dati (reali), CTRLZ per
    finire\n")
  • while (!fine_lettura)
    / continua fino al CTRLZ /
  • stato scanf ("f", numero) / in
    stato numero dati letti /
  • if (stato 1)
  • somma numero
    / accumula in somma /
  • numdati / incrementa numdati (dati
    letti correttamente) /
  • else
  • fine_lettura VERO
    / fine lettura /

  • / fine di while NOT fine_lettura /

6
Esempio
  • if (numdati 0)
  • printf ("Media non calcolabile\n")
  • else
  • media somma / numdati
  • printf ("La media su d dati e' f\n",
    numdati, media)
  • Oltre alla scanf e alla printf il C possiede
    numerose altre funzioni di lettura e scrittura
    sia di caratteri sia di altri tipi di dato.

7
getchar()
  • Lettura di un carattere da tastiera
  • getchar()
  • La funzione senza parametri getchar è definita in
    stdio.h di tipo intero (int) e restituisce un
    numero intero corrispondente al codice del tasto
    premuto.
  •  
  • In caso di fine file fornisce il valore
    particolare EOF (per la maggior parte dei sistemi
    vale -1) il quale è predefinito come simbolo in
    stdio.h.
  •  
  • Se si esclude il caso dell'EOF è lecito assegnare
    il valore fornito da questa funzione ad una
    variabile di tipo carattere (char).

8
Esempio
  • include ltstdio.hgt
  • int carat
  •  
  • main()
  • printf ("Inserisci dei caratteri, CTRLZ per
    finire\n ")
  • while ( ( carat getchar() ) ! EOF)
  • printf ("c", carat)
  • Nella condizione del while, prima è valutato
    l'assegnamento di getchar a carat, poi il
    risultato di questa operazione è confrontato con
    EOF.

9
Input di caratteri
  • L'esecuzione di questo programma produce uno
    strano effetto i caratteri appaiono sullo
    schermo man mano che sono introdotti quando poi
    si preme ltRETURNgt (invio) viene visualizzata di
    nuovo tutta la riga.
  •  
  • La giustificazione sta nel fatto che la gestione
    fisica dell'input, è operata dal Sistema
    Operativo il quale legge i caratteri provenienti
    da tastiera, ne fa l'eco sul video e li
    immagazzina in un vettore interno (buffer di
    tastiera).
  •  
  • I caratteri introdotti sono trasmessi al
    programma solo dopo che è stato introdotto un
    carattere terminatore (come per esempio ltRETURNgt,
    ecc.).

10
Input di caratteri
  • In questo modo si consente all'utente l'eventuale
    modifica della sequenza dei caratteri già
    introdotti fino a quando non invia un ltRETURNgt
    questa funzionalità è nota col nome di editing di
    linea.
  •  
  • I caratteri ltRETURNgt, ltCONTROLgt Z, ltCONTROLgt C,
    ltBREAKgt costituiscono eventi significativi di
    tastiera.
  •  
  • Le procedure interne attivate da scanf e getchar
    aspettano che ci sia un evento significativo
    prima di eseguire le operazioni alle quali sono
    preposte.

11
putchar()
  • Visualizzazione di un carattere sul monitor
  • putchar(ltcaratteregt)
  • La funzione di tipo intero putchar prevede un
    parametro di tipo char, quello appunto che si
    vuole inviare al video.
  •  
  • In realtà la definizione in stdio.h rivela che il
    tipo carattere del parametro viene internamente
    convertito ad intero.
  •  
  • Il valore restituito da putchar coincide con il
    carattere stesso se l'operazione di output ha
    successo, altrimenti vale EOF. 

12
Esempio
  • include ltstdio.hgt
  • char carat
  •  
  • main()
  • printf ("Visualizzazione dei caratteri ASCII\n
    ")
  • carat
  • while (carat lt )
  • putchar (carat)
  • carat
  • putchar( \n )
    / new-line finale /

13
Confronto tra le istruzioni di I/O
  • scanf e printf sono costruite a partire da
    getchar/putchar
  • scanf/printf sono utili quando è noto il formato
    (tipo) del dato che viene letto.
  • getchar/putchar sono utili quando non è noto il
    formato, ad esempio un testo in cui sono
    presenti spazi e punteggiatura e che pertanto non
    è trattabile con semplicità da scanf e printf.

14
Input di testi
  • Se si deve leggere un testo (inclusi spazi e
    punteggiatura) la scanf non è utilizzabile e la
    getchar è scomoda da usare.
  • Per introdurre testi il C fornisce unapposita
    istruzione, la
  • gets (ltstringagt)
  • che legge da tastiera una riga intera, compresi
    spazi e punteggiatura, fino allintroduzione di
    ltRETURNgt (INVIO)
  • la sequenza di caratteri letti viene trasmessa al
    programma sottoforma di stringa in ltstringagt,
    senza il carattere \n.

15
Input di testi
  • Poiché come al solito non ci sono controlli sugli
    indici, la stringa deve essere dimensionata
    opportunamente.
  • Non è tuttavia possibile limitare il numero di
    caratteri che lutente introduce e pertanto si è
    esposti a eventuali danni causati dal
    travalicamento dei limiti.
  • La ltstringagt così introdotta è una stringa a
    tutti gli effetti infatti la gets inserisce il
    carattere di fine stringa NULL (ovvero \0).
  • Pertanto ltstringagt può essere normalmente
    elaborata.

16
Output di testi
  • Anche per visualizzare testi il C fornisce
    unapposita istruzione, la
  • puts ( ltstringagt )
  • che visualizza sul monitor ltstringagt,
    aggiungendo alla fine della stringa un \n.
  • Listruzione
  • puts (stringa)
  • produce lo stesso output di
  • printf (s\n, stringa)

17
I/O di testi - Esempio
  • include ltstdio.hgt
  • main()
  • char riga80
  • printf (Introduci una riga di testo\n)
  • gets (riga)
  • printf (Hai scritto\n)
  • puts (riga)

18
sprintf e sscanf
  • Importanti sono anche le due funzioni sprintf e
    sscanf, che operano come la printf e la scanf,
    effettuando una conversione pilotata da un
    format la differenza sta nel riferimento
    stringa invece di stream (tastiera o monitor).
  •  
  • La sintassi di sprintf è
  • sprintf (ltstringagt, ltformatgt, ltlista
    variabiligt)
  •  
  • Genera in ltstringagt la stessa sequenza di
    caratteri che genererebbe la printf sul monitor.
    Alla fine chiude la stringa appena generata col
    carattere \0 (NULL).

19
sprintf e sscanf
  • Ad esempio, eseguendo il seguente frammento di
    programma
  • int giorno, mese, anno
  • char data80
  • giorno 12
  • mese 2
  • anno 2005
  • sprintf(data,"Torino 2d-2d-4d", giorno, mese,
    anno)
  • La stringa data sarà formata dalla seguente
    sequenza di caratteri
  • Torino 12- 2-2005\0.

20
sprintf e sscanf
  • La sintassi di sscanf è
  • sscanf (ltstringagt, ltformatgt, ltlista variabiligt)
  • Le variabili della lista vengono lette
    interpretando i caratteri contenuti in ltstringagt
    secondo le modalità fissate dagli specificatori
    di formato contenuti nel format.
  •  
  • Esempio
  • int giorno, mese, anno
  • char data10 2, 0, , 7, , 2,
    0, 0, 5, \0
  • ..
  • sscanf (data,ddd, giorno, mese, anno)
  • giorno vale 20, mese vale 7 e anno vale 2005.

21
Dati sulla linea di comando
  • Abbiamo già avuto occasione di osservare come il
    main sia in realtà una funzione.
  • Come le altre funzioni il main è in grado di
    ricevere dei parametri che devono essere indicati
    tra le parentesi tonde che devono seguire la
    parola chiave main.
  • Questi parametri vanno scritti di seguito al nome
    del programma sulla linea di comando e separati
    tra loro dallo spazio.
  • Si tratta evidentemente di unutile alternativa
    allintroduzione dei dati da tastiera.
  • Esempio
  • bmi 72.60 175

22
Dati sulla linea di comando
  • I parametri così indicati vengono passati dal
    sistema operativo al main tramite la seguente
    coppia di parametri
  • int argc argument counter
  • char argv argument vector
  • argc è una variabile intera che contiene il
    numero di parametri contenuti nel vettore di
    stringhe argv.
  • argv è un vettore di stringhe.
  • Queste due variabili devono essere dichiarate
    come parametri della funzione main
  • int main (int argc, char argv)

23
Dati sulla linea di comando
  • argc indica il numero di parametri presenti
    sulla riga di comando, incluso il nome del
    programma (pertanto vale sempre almeno 1).
  • il vettore argv (in realtà è una matrice di
    caratteri) contiene i parametri veri e propri
    sottoforma di stringhe di caratteri secondo il
    seguente formato
  • argv0 è il nome del programma
  • argvn è la stringa che rappresenta lennesimo
    parametro dopo il nome del programma.
  • I parametri pertanto sono sempre delle stringhe
    per trasformarli in rappresentazioni numeriche
    occorre usare le funzioni approppriate (atoi,
    atol, atof) o la sscanf.

24
Dati sulla linea di comando
  • Struttura
  • Esempio c\gt programma.exe 3 pippo.dat 3.2

argc 4
argv0
programma.exe\0
argv1
3\0
argv2
pippo.dat\0
argv3
3.2\0
25
Dati sulla linea di comando
  • Scrivere un programma che legga sulla linea di
    comando due interi N e D, e visualizzi tutti i
    numeri minori di N che sono divisibili per D.
  • Il programma dovrà pertanto essere eseguito con
    il seguente comando
  • myprog N D
  • dove myprog è il nome del programma, N e D sono
    i due valori richiesti per il funzionamento del
    programma.

26
Dati sulla linea di comando
  • include ltstdio.hgt
  • int main(int argc, char argv)
  • int N, D, i
  • if (argc ! 3)
  • printf (Numero argomenti
    errato\nSintassi myprog N D)
  • return 1
  • N atoi (argv1) /
    converte N /
  • D atoi (argv2) /
    converte D /
  • for (i 1 i lt N i)
  • if ((i D) 0) printf (d\n, i)

Test per verificare che lutente ha introdotto
il numero esatto di dati
Write a Comment
User Comments (0)
About PowerShow.com