In questa lezione studieremo come utilizzare le funzioni di input e output in linguaggio C.
Le funzioni di input
Le funzioni di input in C che analizzeremo sono scanf, getc e getchar.
scanf()
La funzione scanf consente di acquisire una sequenza di caratteri (lettere o cifre) dalla tastiera e di memorizzarli all’interno di opportune variabili.
Sintassi
scanf(<StringaDiFormato>,[&]Variabile1, [&]Variabile2, ...);
StringaDiFormato: rappresenta lo specificatore di formato ed è introdotta dal simbolo %
Variabile: rappresenta il nome della variabile all’interno della quale dovrà essere memorizzato il dato proveniente dalla tastiera.
&: l’operatore &
(se necessario) dovrebbe essere utilizzato per passare l’indirizzo di memoria della variabile. Ma l’operatore &
non è sempre necessario per tutte le variabili, dipende dal tipo di dati. Ad esempio, è necessario utilizzare &
per leggere dati in tipi di dati non puntatore come int
, float
, char
, ecc., ma non è necessario per tipi di dati puntatore come char*
, int*
, ecc.
Specificatore di formato
Specificatore di formato | Espresssione | Visualizza sul monitor |
%c | char | carattere singolo |
%d (%i) | int | intero decimale con segno |
%e (%E) | float o double | formato esponenziale |
%f | float o double | reale con segno |
%g (%G) | float o double | utilizza %f o %e in base alle esigenze |
%0 | int | valore in base 8 senza segno |
%p | pointer | valore di una variabile puntatore |
%s | array of char | stringa (sequenza) di caratteri |
%u | int | intero senza segno |
%x (%X) | int | valore in base 16 senza segno |
Es: scanf("%d", &base);
Il simbolo & davanti alla variabile indica l’indirizzo di memoria in cui si trova la variabile base.
Si interpreta in questo modo: leggi un dato intero e collocalo nella posizione di memoria il cui indirizzo è &base.
Es: scanf("%d %d", &x, &y);
Questa istruzione acquisisce due numeri interi memorizzate nelle variabili x e y
L’omissione di & non comporta nessun messaggio di errore da parte del compilatore, ma comporta degli errori nei risultati.
getc()
La funzione getc è utilizzata per leggere un singolo carattere da un file, ma può leggere anche un carattere da tastiera.
Esempio
#include <stdio.h>
int main() {
char c;
printf("Inserisci un carattere: "); // Chiede all'utente di inserire un carattere
c = getc(stdin); // Legge un carattere da tastiera (standard input stdin)
printf("Il carattere inserito è: %c\n", c); // Stampa il carattere letto
return 0;
}
Dunque la funzione getc() è principalmente utilizzata quando si desidera leggere un singolo carattere da un file o da stdin (standard input).
Ecco alcune tipiche situazioni dove può essere utile:
Lettura da file di testo: Quando si desidera leggere un carattere per volta da un file di testo, ad esempio per analizzarne il contenuto o eseguire operazioni specifiche su di esso.
Interazione con l’utente: Per la lettura di input da parte dell’utente da tastiera quando si desidera leggere un solo carattere alla volta. Ad esempio, nei menu a selezione singola o in applicazioni che richiedono un input di carattere singolo.
Analisi dei dati: In alcune situazioni, si potrebbe dover analizzare o elaborare i dati carattere per carattere anziché linea per linea. getc() può essere utile in tali scenari.
In generale, getc() è utilizzata ogni volta che è necessario leggere un singolo carattere, sia da un file che da stdin, ed è utile in una vasta gamma di applicazioni che coinvolgono l’input e l’output di dati di carattere singolo. Ma per la lettura di righe intere di testo, è più conveniente utilizzare altre funzioni come fgets().
getchar()
La funzione getchar()
è utilizzata per leggere un singolo carattere dalla tastiera, e corrisponde ad un’applicazione specifica della funzione getc()
quando viene passato stdin
come argomento. In pratica, getchar()
è equivalente a getc(stdin)
.
Utilizzo:
La funzione getchar()
viene utilizzata principalmente quando è necessario leggere un singolo carattere dalla tastiera. Ad esempio, può essere utilizzata per implementare un semplice programma che acquisisce un singolo carattere da tastiera e lo utilizza per prendere decisioni o eseguire azioni.
Esempio:
#include <stdio.h>
int main() {
char c;
printf("Inserisci un carattere: "); // Chiede all'utente di inserire un carattere
c = getchar(); // Legge un carattere da tastiera
printf("Il carattere inserito è: %c\n", c); // Stampa il carattere letto
return 0;
}
In questo esempio, getchar()
viene utilizzata per leggere un singolo carattere dalla tastiera e memorizzarlo nella variabile c
, che viene poi stampata a schermo.
In sintesi, getchar()
è utile quando si desidera leggere un singolo carattere dalla tastiera e si preferisce una sintassi più concisa rispetto a getc(stdin)
.
Le funzioni di output
Le funzioni di output in C che studieremo sono: printf, putc e putchar.
printf()
La forma sintattica è la seguente:
printf(<StringaDiFormato>,[, <Argomenti>]);
<StringaDiFormato>
è una stringa di caratteri che può contenere specificatori di formato.<Argomenti>
sono gli argomenti da stampare nella stringa di formato.
Es: printf("Base: %d", base);
Stampa a video il valore intero della base.
La sequenza di escape
Le sequenze di escape sono dei caratteri che non vengono visualizzati, ma contribuiscono a formattare il testo. Tutte le sequenze di escape iniziano con il carattere di backslash (\) e sono interpretate come un singolo carattere.
Sequenza di escape | Descrizione |
\n | nuova riga (new line) |
\t | tabulazione (tab) |
\a | segnale sonoro (alert) |
\f | nuova pagina (form feed) |
\r | ritorno a capo della stessa riga |
\v | tabulazione verticale |
\b | una battuta indietro (backspace) |
\\ | barra rovesciata (backslash) |
\’ | apice singolo |
\” | doppi apici |
\? | punto di domanda |
\0 | fine stringa |
\<CifraOttale> | numero ottale |
\<CifraEsadecimale> | numero esadecimale |
Esempio
int base = 10;
printf("Base: %d", base);
putc()
La funzione putc()
è utilizzata per scrivere un singolo carattere su un file o su un dispositivo di output specificato.
La sintassi è la seguente:
int putc(int char, FILE *stream);
char
: Il carattere da scrivere sul file o sul dispositivo di output.stream
: Il puntatore al file o al dispositivo di output su cui si desidera scrivere il carattere.
Esempio
#include <stdio.h>
int main() {
char c = 'a';
FILE *file_pointer;
// Apre il file "output.txt" in modalità scrittura
file_pointer = fopen("output.txt", "w");
// Verifica se il file è stato aperto correttamente
if (file_pointer != NULL) {
putc(c, file_pointer); // Scrive il carattere 'a' nel file
fclose(file_pointer); // Chiude il file
printf("Il carattere è stato scritto correttamente nel file.\n");
} else {
printf("Impossibile aprire il file.\n"); // Messaggio di errore se il file non può essere aperto
}
return 0;
}
In questo esempio, il carattere 'a'
viene scritto nel file “output.txt” utilizzando putc()
. Il file viene aperto in modalità scrittura ("w"
) e il carattere viene scritto utilizzando il puntatore di file file_pointer
. Infine, il file viene chiuso con fclose()
. Se il file non può essere aperto correttamente, verrà visualizzato un messaggio di errore.
Assicuriamoci di avere i permessi necessari per scrivere sul file e che il percorso specificato sia corretto. Se il file non esiste, verrà creato; se esiste già, il suo contenuto verrà sovrascritto.
putchar()
La funzione putchar()
è utilizzata per scrivere un singolo carattere su stdout
.
La sintassi è la seguente:
int putchar(int c);
c
: rappresenta il carattere da scrivere su stdout
.
Funzionamento:
Quando chiamiamo putchar()
, il carattere c
viene scritto sullo standard output, che è generalmente la console o il terminale in cui il programma è in esecuzione. Il carattere verrà quindi visualizzato sullo schermo.
Esempio
#include <stdio.h>
int main() {
char c = 'a';
putchar(c); // Scrive il carattere 'a' su stdout (generalmente la console)
return 0;
}
In questo esempio, stiamo utilizzando putchar()
per scrivere il carattere 'a'
su stdout
. Quando il programma viene eseguito, il carattere 'a'
verrà visualizzato sulla console.
Nota:
putchar()
è simile aputc()
, ma è progettato specificamente per scrivere un singolo carattere sustdout
. Inoltre, restituisce il carattere scritto come un valore intero, o EOF in caso di errore.
La funzione putchar()
è utile quando si desidera scrivere un singolo carattere senza dover aprire o chiudere un file. È particolarmente comoda per la stampa di singoli caratteri su stdout
, come messaggi di testo, prompt o caratteri di separazione.
Altre funzioni di input/output
Oltre alle funzioni di input e output discusse precedentemente, ci sono molte altre funzioni utili disponibili nel linguaggio C. Ecco alcune di esse:
- Funzioni di Input da File:
fgets()
: Utilizzata per leggere una riga di testo da un file.fscanf()
: Simile ascanf()
, ma legge input da un file anziché dalla tastiera.
- Funzioni di Output su File:
fputs()
: Utilizzata per scrivere una stringa su un file.fprintf()
: Simile aprintf()
, ma scrive output su un file anziché sustdout
.
- Gestione dei File:
fopen()
: Utilizzata per aprire un file.fclose()
: Utilizzata per chiudere un file aperto.feof()
: Utilizzata per verificare se è stata raggiunta la fine di un file.
- Funzioni di Input/Output Binario:
fread()
: Utilizzata per leggere blocchi di dati da un file binario.fwrite()
: Utilizzata per scrivere blocchi di dati in un file binario.
- Gestione del Puntatore di File:
ftell()
: Utilizzata per ottenere la posizione corrente nel file.fseek()
: Utilizzata per spostare il puntatore di file a una posizione specificata nel file.
- Funzioni di Output su Standard Error:
fprintf(stderr, ...)
: Simile afprintf()
, ma scrive output sustderr
, che di solito è associato all’output degli errori anziché alla console.
Queste sono solo alcune delle funzioni più comuni per l’input e l’output in C. Ogni funzione ha le proprie caratteristiche e scopi specifici, e la scelta della funzione da utilizzare dipenderà dalle esigenze del programma e del tipo di dati con cui si sta lavorando.
Conclusioni
In questo articolo abbiamo esaminato le funzioni di input e output in linguaggio C, con un focus su scanf()
, getc()
, getchar()
, putc()
, e putchar()
.
Ecco un breve riassunto di quanto discusso:
- Funzioni di Input:
scanf()
: Utilizzata per acquisire input dalla tastiera e memorizzarlo in variabili specificate. È necessario specificare il formato di input utilizzando specificatori di formato come%d
,%f
,%c
, ecc.getc()
: Utilizzata per leggere un singolo carattere da un file. Può anche leggere un carattere dalla tastiera.getchar()
: Simile agetc()
, ma specificamente utilizzata per leggere un carattere dalla tastiera.
- Funzioni di Output:
putc()
: Utilizzata per scrivere un singolo carattere su un file o su un dispositivo di output specificato.putchar()
: Simile aputc()
, ma specificamente utilizzata per scrivere un singolo carattere sustdout
.
- Utilizzi Principali:
scanf()
,getc()
, egetchar()
sono utilizzate per l’input da tastiera o da file.putc()
eputchar()
sono utilizzate per l’output su file o su dispositivi di output specificati.
- Sequenze di Escape:
- Abbiamo esaminato alcune sequenze di escape comuni utilizzate per formattare il testo in C, come
\n
,\t
,\b
, ecc.
- Abbiamo esaminato alcune sequenze di escape comuni utilizzate per formattare il testo in C, come
- Considerazioni Finali:
- È importante utilizzare correttamente le funzioni di input e output in base alle esigenze del programma.
- Le sequenze di escape possono essere utili per formattare il testo in modo appropriato.
In sintesi, le funzioni di input e output in C forniscono gli strumenti necessari per acquisire input dall’utente, leggere e scrivere su file, e gestire l’output dei programmi. Con una comprensione chiara di queste funzioni e delle sequenze di escape, è possibile sviluppare applicazioni C più efficaci e flessibili.
N.B.: Assicuriamoci sempre di gestire gli errori in modo appropriato durante l’utilizzo delle funzioni di input e output, controllando il valore restituito dalle funzioni e gestendo situazioni inaspettate in modo adeguato.