Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente bannato
    Registrato dal
    Aug 2001
    Messaggi
    894

    [Pascal] Esiste il file?

    qual'e la procedura che permette di stabilire l'esistenza di un file sul disco?

  2. #2

    Re: [Pascal] Esiste il file?

    Originariamente inviato da gif
    qual'e la procedura che permette di stabilire l'esistenza di un file sul disco?
    Dipende dal compilatore e dal S.O. che usi
    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:

    codice:
    { 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.
    HTH
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

  3. #3
    Utente bannato
    Registrato dal
    Aug 2001
    Messaggi
    894
    gia conoscevo questa funzione ma avevo dei problemi adimplementarla:
    cosa significa {$I-} e {$I+}? e FileMode a chi appartiene?

    inoltre considerando questo codice:
    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;
    dovrebbe funzionare in questo modo:
    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?

  4. #4
    Originariamente inviato da gif
    gia conoscevo questa funzione ma avevo dei problemi adimplementarla:
    cosa significa {$I-} e {$I+}? e FileMode a chi appartiene?
    {$I-} disabilita gli errori di runtime di I/O, lasciando "passare" le funzioni e permettendo di interrogarne l'esito tramite una variabile IOResult.
    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

  5. #5
    Utente bannato
    Registrato dal
    Aug 2001
    Messaggi
    894
    i ringrazio davvero molto per i tuoi suggerimenti, ma voglio chiederti qualcosa nel dettaglio:
    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 nPraricamente l'operatore non può uscire subito senza fare nulla non appena il programma parte. Questo è male :-)
    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... cmq
    Al di là del fatto che questa soluzione di interfaccia utente è piuttosto povera (ma sorvoliamo)
    in che senso? Dato che sono ai primi giorni con il pascal, mi indichi cosa ti sembra povero o poco evoluto?

    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

  6. #6
    Originariamente 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;
    ...
    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

    ultima cosa, come posso realizzare un .exe (per console) di questo file con dev-pascal o turbo pascal?

    grazie
    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).
    Che il pelo cresca sempre fluente sui vostri piedi
    Bilbo
    Visita il sito della Società Tolkieniana Italiana

  7. #7
    Utente bannato
    Registrato dal
    Aug 2001
    Messaggi
    894
    :suonata: grazie sei un amico!!! :metallica

  8. #8
    Utente bannato
    Registrato dal
    Aug 2001
    Messaggi
    894
    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 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!!

  9. #9
    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!!
    Beh, innanzitutto c'è la funzione readkey. Il seguente programmino ne è un esempio:

    codice:
    uses Crt;
    
    var
     C: Char;
    
    begin
     Writeln('Premi un tasto, va''');
     C := Readkey;
     Writeln('Hai premuto il carattere ASCII ',Ord(C),'.');
    end.
    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.

    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.