Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Programmazione Facile in C AMICA MAGAZINE<br />
D * . . . . . . . . . . . . . . . . . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *<br />
mette, cioè, di associare ad una<br />
unità fisica una unità logica, con-<br />
sentendoci, quindi, di operare allo<br />
stesso modo su un file come su una<br />
periferica. La grande comodità si<br />
vede quando da CL1 utilizziamo la<br />
redirezione dell'input/output per<br />
stampare, ad esempio, il contenuto<br />
di una directory, ci basta infatti<br />
scrivere: DIR DFO : > prt :<br />
per comunicare al sistema operati-<br />
vo che il "meccanismo" al quale<br />
inviare i dati non è lo schermo ma la<br />
stampante. Lo stesso si sarebbe<br />
potuto fare per copiare in un file<br />
l'elenco dei file contenuti in una di-<br />
rectory (vengono scritti solo i nomi):<br />
DIR DFO: > PIPPO<br />
Nel file pippo avremo tutte le speci-<br />
fiche relative ai programmi di cui<br />
disponiamo. A questo punto dire<br />
che si può considerare una finestra<br />
come un file non è più azzardato,<br />
basta dire che è un file di tipo CON:<br />
e la funzione Open si occupa della<br />
sua generazione<br />
fileaperto = Open("CON:10/10/200/<br />
lOO/<strong>Amiga</strong><strong>Magazine</strong>",MODE-OLDFILE)<br />
Semplice, vero? Abbiamo creato<br />
una finestra e ora possiamo usarla<br />
come qualsiasi file, per scrivervi<br />
basta infatti usare la funzione Write.<br />
Nuova importante funzione, sappia-<br />
mo tutti quanto è importante avere<br />
dei dischi ben organizzati, vista, so-<br />
prattutto, la lentezza di lettura delle<br />
directory da parte di <strong>Amiga</strong>Dos,<br />
spesso si hanno delle versioni vec-<br />
chie di file che, anacronistiche, non<br />
ci servono più. Da CL1 la procedura<br />
è semplicissima, basta scrivere:<br />
DELETENOMEFILE<br />
ma se vogliamo cancellare un file<br />
dall'interno del programma?<br />
La funzione che fa questo c'è, si<br />
chiama (e non c'è da sorprendersi)<br />
proprio:<br />
~elete File (nomefile)<br />
Quanto detto per Rename vale ov-<br />
viamente anche per DeleteFile,<br />
anche in questo caso abbiamo a<br />
che fare con una funzione e quindi<br />
possiamo controllare il suo valore di<br />
ritorno:<br />
if ( (DeleteFile (pippo) ==O) )<br />
Write (sp, "Attenzioone si è verificato<br />
un errore", 40) ;<br />
A questo punto è buona norma<br />
astrarre il discorso e considerare<br />
non solo i file ma anche i device;<br />
come abbiamo detto in precedenza<br />
una delle grandi capacità di <strong>Amiga</strong>-<br />
Dos è trattare le periferiche come<br />
file, il concetto è ripreso da sistemi<br />
operativi più potenti, quali, per<br />
esempio, Unix o Xenix, dove il pro-<br />
grammatore può uniformare le sue<br />
tecniche di programmazione senza<br />
doversi preoccupare della gestione<br />
delle periferiche, sarà poi il sistema<br />
operativo, utilizzando procedure<br />
specifiche per ogni dispositivo, a<br />
gestire le differenze tra i file e le<br />
periferiche. Vi siete mai chiesti per-<br />
ché i programmi Pascal iniziano con<br />
I'intestativo:<br />
programpippo (input,output);<br />
e soprattutto cosa significa quanto<br />
scritto tra parentesi? Il programma<br />
Pascal che faremo seguire accetterà<br />
i dati in ingresso dal meccanismo<br />
standard di input (la tastiera) mentre<br />
emetterà I'output nel meccanismo<br />
standard di output (il terminale).<br />
Viene lecito allora chiedersi, visto<br />
che i dati vengono inseriti datastiera<br />
e visualizzati sul monitor, perché<br />
rendere prolisso il codice; la risposta,<br />
naturalmente, esiste e si riassume<br />
nelle capacità del linguaggio di<br />
redirigere I1input/output, se scriviamo<br />
quindi:<br />
Program Filtro (pippo, pluto) ;<br />
il nostro programma utilizzerà I'input<br />
preso dal file pippo (e non da tastie-<br />
ra) e lo emetterà nel file pluto (non,<br />
quindi, sul videoterminale). Questa<br />
meravigliosa prerogativa ci consen-<br />
te di creare programmi filtro, driver<br />
di stampa e, comunque, procedure<br />
che non necessitino di intervento<br />
dall'esterno. In C la gestione dell' I/<br />
O è molto simile, si hanno sempre<br />
dei file standard, che si chiamano<br />
stdin e stdout, ve ne è però uno in<br />
più: stderr. Stderr rappresenta un<br />
canale alternativo, I'input proviene<br />
da stdin, i risultati vengono visualiz-<br />
zati su stdout e gli errori su stderr.<br />
E' interessantissimo, a questo pun-<br />
to, sapere come recuperare i file<br />
handle dei file standard così da<br />
poterli utilizzare come normali archi-<br />
vi, con tutti i vantaggi derivati dalle<br />
funzioni per essi studiate.<br />
Esistono due funzioni che ci permet-<br />
tono di avere a disposizione i punta-<br />
tori alle strutture di file handle relativi<br />
ai file in questione, esse si chiama-<br />
no, guarda caso, Input() e Output().<br />
Ultima funzione che ci accingiamo<br />
ad analizzare è WaitForChar, il suo<br />
utilizzo è semplicissimo, equivale<br />
alla INKEY$ del BASIC o alla<br />
read(kbd,. ..); del Pascal. WaitFor-<br />
Char non fa altro che attendere per<br />
un tempo specificato che l'utente<br />
prema un tasto, se il tempo è scadu-<br />
to restituisce O altrimenti -1. A que-<br />
sto punto è sufficiente vedere cosa<br />
si trova nel buffer associato al file<br />
per leggere I'input. I parametri ac-<br />
cettati dalla WaitForChar sono so-<br />
stanzialmente due: deve essere<br />
presente il file handle del file dal<br />
quale leggere I'input e, naturalmen-<br />
te, il tempo di durata dell'attesa (che<br />
è misurato in microsecondi).<br />
Come prima possiamo aggiungere<br />
un controllo sull'avvenuto inseri-<br />
mento del carattere:<br />
if ( (lettcd&itFodx (file-Me, 1000000) ) 4)<br />
printf('1'utentenonhapremutonessun<br />
tasto\nr'<br />
Naturalmente, abbiamo fatto riferi-<br />
mento al file-handle dello stdin, è<br />
stato determinato, così: