qual'e la procedura che permette di stabilire l'esistenza di un file sul disco?
qual'e la procedura che permette di stabilire l'esistenza di un file sul disco?
Dipende dal compilatore e dal S.O. che usiOriginariamente inviato da gif
qual'e la procedura che permette di stabilire l'esistenza di un file sul disco?
Un metodo abbastanza generale è provare ad aprire il file in lettura. Se ti dà un errore significa che, probabilmente, il file non c'è. Tra l'altro è possibile "interpretare" l'errore stesso per capire perché non si è riusciti a leggerlo. Questo è un esempio tratto dal vecchio Help del Borland Pascal 7 (ho solo tradotto i commenti:
HTHcodice:{ For Windows: } { uses WinCrt; } function FileExists(FileName: String): Boolean; var F: file; begin {$I-} Assign(F, FileName); FileMode := 0; { Imposta l'accesso in sola lettura } Reset(F); Close(F); {$I+} FileExists := (IOResult = 0) and (FileName <> ''); end; begin { Uso ParamStr(1) come file. Il programma accetta dunque un parametro dalla command line } if FileExists(ParamStr(1)) then Writeln('Il File esiste') else Writeln('I File non esiste'); end.
Che il pelo cresca sempre fluente sui vostri piedi
Bilbo
Visita il sito della Società Tolkieniana Italiana
gia conoscevo questa funzione ma avevo dei problemi adimplementarla:
cosa significa {$I-} e {$I+}? e FileMode a chi appartiene?
inoltre considerando questo codice:
dovrebbe funzionare in questo modo:codice:While (chiudi <> 's') do begin scelta := 'r'; (*resetto il valore di scelta*) repeat writeln('Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n'); readln(scelta); until((scelta = 'f') or (scelta = 'n')); writeln('Vuoi terminare il programma? Digita s per chiudere'); read(chiudi); end;
Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n
f
(non accade nulla perche devo aggiungere dopo la funzione...)
Vuoi terminare il programma? Digita s per chiudere
j (digito j o qualsiasi altra lettera diversa da s perche non voglio chiudere)
(e cos'accade???)
Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n
Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n
(mi stampa 2 volta la scritta Se vuoi... senza considerare il comando readln
Come mai??? Dov'e l'errore?
{$I-} disabilita gli errori di runtime di I/O, lasciando "passare" le funzioni e permettendo di interrogarne l'esito tramite una variabile IOResult.Originariamente inviato da gif
gia conoscevo questa funzione ma avevo dei problemi adimplementarla:
cosa significa {$I-} e {$I+}? e FileMode a chi appartiene?
Quanto alla portabiità non saprei, però un po' tutti i compilatori hanno l'opzione di I/O checking
inoltre considerando questo codice:
codice:While (chiudi <> 's') do begin [...] end
Ok, questa è tutta un'altra storia. Innanzi tutto c'è un errore grossolano di flusso del programma, per lo meno visto così, perché per uscire dal ciclo di richiesta devi per forza prima premere f o n. Praricamente l'operatore non può uscire subito senza fare nulla non appena il programma parte. Questo è male :-)
Al di là del fatto che questa soluzione di interfaccia utente è piuttosto povera (ma sorvoliamo), drei che la cosa miglire in questo caso è quella di fare un unico ciclo di richieste, una specie di menu, con tutte le opzioni possibili. Se vuoi nidificare i menu, fallo fattorizzandone le funzioni. Mi spiego: se un menu chiamerebbe un altro menu, perché si apre su un certo numero di altre scelte, allora dal menu principale chiama una funzione che si crea il suo contesto per il menu e da lì non esce finché non ha finito.
Comunque eccoti un esempio pronto. Questo programma continua a chiedere cosa vuoi fare. Ogni volta che gli dai una lettera, se è valida la "esegue", altrimenti non fa nulla e ristampa nuovamente il menu. Quando premi la 's' ti saluta e se ne va
codice:program Filmini; procedure RicercaFilm; begin Writeln('Mi hai chiesto di cercare un film. Ora non ne ho voglia'); end; procedure NuovoFilm; begin Writeln('Mi hai chiesto di inserire un nuovo film. Beh? allora?'); end; procedure FaiTutto; var scelta : char; finito : boolean; begin finito := false; while (not finito) do begin writeln ('F per ricercare un film, n per inserirne uno, s per uscire write ('La tua scelta...: '); readln (scelta); case scelta of 'f': RicercaFilm; { funzione dove fare tutto } 'n': NuovoFilm; { funzione dove fare tutto } { altre opzioni } 's': finito := true; end; end; Writeln('Fine del progranna, ciao ciao è stato bello'); end; begin FaiTutto; end.
Che il pelo cresca sempre fluente sui vostri piedi
Bilbo
Visita il sito della Società Tolkieniana Italiana
i ringrazio davvero molto per i tuoi suggerimenti, ma voglio chiederti qualcosa nel dettaglio:
ok questa e una scelta che ho fatto, infatti prima di questo ciclo l'utente aveva la possibilita di uscire, ma poiche ha preferito avviare il programma e entrato nel ciclo dove ha a disposizione la possibilita di effettuare una ricerca o aggiungere un film... sarebbe stato opportuno inserire la possibilita di uscire ma non e necessario in questo punto... cmqInnanzi tutto c'è un errore grossolano di flusso del programma, per lo meno visto così, perché per uscire dal ciclo di richiesta devi per forza prima premere f o nPraricamente l'operatore non può uscire subito senza fare nulla non appena il programma parte. Questo è male :-)
in che senso? Dato che sono ai primi giorni con il pascal, mi indichi cosa ti sembra povero o poco evoluto?Al di là del fatto che questa soluzione di interfaccia utente è piuttosto povera (ma sorvoliamo)
il tuo esempio non l'ho ancora testato me direi che va benissimo, l'unica cosa e che non riesco a capire perche il mio non funziona come dovrebbe, cioe razionalmente (lasciamo stare la comodita di poter uscire oltre che effettuare la scelta di ricerca o inserimento) dovrebbe dopo aver digitato una lettera che non fosse 's' il ciclo while dovrebbe ripetersi normalmente e invece mi riscrive 2 volte 'Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n' senza tenere conto la prima volta del readln;
ultima cosa, come posso realizzare un .exe (per console) di questo file con dev-pascal o turbo pascal?
grazie
Allora, lì è per colpa del read. Se metti readln va tutto a posto. Infatti la read e la readln nascono nell'era del nastro e del perforatore di schede; a quei tempi non c'era un input interattivo come ora. Pertanto se tu ad una read (senza ln) rispondi con un carattere e poi con invio, lui "occupa" anche la successiva readln. D'altro canto non puoi semplicemente scrivere la lettera e non premere invio perché il DOS ha un buffer di riga che non invia i caratteri all'applicazione chiamante finché non chiudi la rigaOriginariamente inviato da gif
...
il tuo esempio non l'ho ancora testato me direi che va benissimo, l'unica cosa e che non riesco a capire perche il mio non funziona come dovrebbe, cioe razionalmente [...] dovrebbe dopo aver digitato una lettera che non fosse 's' il ciclo while dovrebbe ripetersi normalmente e invece mi riscrive 2 volte 'Se vuoi ricercare un film digita f, se vuoi inserirne uno digita n' senza tenere conto la prima volta del readln;
...
Si possono usare altre funzioni per catturare la pressione dei tasti
Beh, il dev-pascal non lo conosco, con il Turbo Pascal devi solo impostare il linker su disco anziché in memoria; se c'è un menu Options->Linker e poi "To Disk" (o qualcosa del genere, dipende dalla versione, io ho il BP7).ultima cosa, come posso realizzare un .exe (per console) di questo file con dev-pascal o turbo pascal?
grazie
Che il pelo cresca sempre fluente sui vostri piedi
Bilbo
Visita il sito della Società Tolkieniana Italiana
:suonata: grazie sei un amico!!! :metallica
mi serivirebbe un altro piccolo aiuto, ovvero mi indicheresti quali sono gli altri metodi per catturare la pressione dei tasti?Originariamente inviato da Piero Salandin
Allora, lì è per colpa del read. Se metti readln va tutto a posto. Infatti la read e la readln nascono nell'era del nastro e del perforatore di schede; a quei tempi non c'era un input interattivo come ora. Pertanto se tu ad una read (senza ln) rispondi con un carattere e poi con invio, lui "occupa" anche la successiva readln. D'altro canto non puoi semplicemente scrivere la lettera e non premere invio perché il DOS ha un buffer di riga che non invia i caratteri all'applicazione chiamante finché non chiudi la riga
Si possono usare altre funzioni per catturare la pressione dei tasti
Beh, il dev-pascal non lo conosco, con il Turbo Pascal devi solo impostare il linker su disco anziché in memoria; se c'è un menu Options->Linker e poi "To Disk" (o qualcosa del genere, dipende dalla versione, io ho il BP7).
mi serve in una procedure diversi read attaccati e quindi dopo l'immissione del testo e la digitazione di enter non voglio saltare all'altra riga!!
Beh, innanzitutto c'è la funzione readkey. Il seguente programmino ne è un esempio:Originariamente inviato da gif
mi serivirebbe un altro piccolo aiuto, ovvero mi indicheresti quali sono gli altri metodi per catturare la pressione dei tasti?
mi serve in una procedure diversi read attaccati e quindi dopo l'immissione del testo e la digitazione di enter non voglio saltare all'altra riga!!
Tuttavia, rimanendo strettamente nell'ambito del vecchio DOS (anche in VDM) c'è tutta una serie di funzioni che molto tempo fa' scovai in un favoloso libro e poi adattai per i miei scopi al fine di costruire un'interfaccia utente interessante. Tali routine sono scritte per il Turbo Pascal 6 e richiedono la direttiva ASM; alcune addirittura giocano con la tabella dei vettori di interrupt.codice:uses Crt; var C: Char; begin Writeln('Premi un tasto, va'''); C := Readkey; Writeln('Hai premuto il carattere ASCII ',Ord(C),'.'); end.
La unit che contiene tali funzioni va considerata (e studiata) tutta assieme, per cui magari è meglio se te lo mando via e-mail. Il libro si chiamava "Turbo Pascal 6 - Tips & Techniques" ed è veramente un gioiellino di libro per imparare un utilizzo interessante del Pascal a oggetti.
Che il pelo cresca sempre fluente sui vostri piedi
Bilbo
Visita il sito della Società Tolkieniana Italiana