31.05.2013 Views

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

Trends - Amiga Magazine Online

SHOW MORE
SHOW LESS

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ì:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!