Rapid-Q by William Yu (c)1999-2000 .

Back to holyguard.net

Capitolo 7: Introduzione ai flussi

7: Introduzione ai flussi

Rapid-Q supporta flussi di file anzichè il comando standard OPEN utilizzato in BASIC. Funzionano in modo analogo, ma hanno nomi diversi. I vantaggi principali dei flussi sono le dimensioni illimitate ed il fatto di poter copiare da e verso flussi diversi (per esempio File e Memoria).

7.1 Flussi di file
I flussi di file sono utilizzati per creare, leggere e scrivere dei file. Tutti i flussi sono aperti in modo binario, senza possibilità di blocco (tutti i file aperti sono condivisi). Questi sono i metodi di apertura dei file:
     fmCreate    - Crea un file, sovrascrive se il file esiste già
     fmOpenRead  - Apre un file in sola lettura
     fmOpenWrite - Apre un file in sola scrittura
     fmOpenReadWrite - Apre un file in lettura & scrittura
Per aprire un file si deve indicare il nome del file ed uno dei metodi sopraindicati.
     DIM File AS QFileStream

     File.Open('Test.txt', fmOpenRead)
In questo modo si apre il file Test.txt in sola lettura. Per leggere i dati, si utilizzano i metodi ReadNum e ReadStr. Vedere RAPIDQ.INC per i codici validi.
     PRINT File.ReadNum(Num_SINGLE)   '-- Legge 4 bytes come numero di tipo SINGLE 
     PRINT File.ReadStr(1024)         '-- Legge 1024 byte
E' possibile immagazzinare il valore in una variabile, utilizzando le routine generiche Read e Write.
     File.Read(A&)          '-- Leggi un valore Long e memorizzalo in A&
     File.Write(B#)         '-- Scrivi il valore Double B#

     '-- o analogamente, con un pò più di lavoro:
     A& = File.ReadNum(Num_LONG)
     File.WriteNum(B#, Num_DOUBLE)
Una volta terminato di lavorare con il file, assicuratevi di chiudere la maniglia. Potrete poi riutilizzare il flusso ed aprire un altro file. Per verificare se avete raggiunto la fine del file, potete confrontare File.Position e File.Size o verificare se File.EOF è vero (-1). Fintanto che File.Position è inferiore a File.Size, non avete raggiunto la fine del file. Esistono due modi per verificare se un file esiste:
     IF FileExists('Test.txt') <> FALSE THEN
       File.Open('Test.txt', fmOpenRead)
     END IF
Tuttavia, è preferibile utilizzare semplicemente:
     IF File.Open('Test.txt', fmOpenRead) = FALSE THEN
        ShowMessage('Impossibile aprire il file')
     END IF
File.Open restituirà un numero diverso da zero se il file è stato aperto correttamente, 0 in caso contrario.

7.2 Flussi di memoria
Un flusso di memoria viene creato con il comando DIM. È simile a un flusso di file, ed ha gli stessi metodi, come ReadNum, WriteNum, ecc... L'unica differenza è che i flussi di memoria sono immagazzinati nella memoria, che può essere aumentata o ridotta senza limiti. È anche possibile memorizzare matrici di numeri nei flussi di memoria (vedere esempio ARRAYS.BAS). I flussi di memoria servono per diversi scopi, fate lavorare la vostra immaginazione. Un utilizzo potrebbe essere la memorizzazione di dati temporanei, ad esempio copiando un file in un flusso di memoria e manipolando i dati in seguito. Come si esegue una copia da un flusso ad un altro? È semplice, si può copiare fra flussi diversi (per esempio da File a Memoria) o flussi dello stesso tipo (per esempio da Memoria a Memoria).
    DIM File AS QFileStream
    File.Open('test.txt', fmOpenRead)

    DIM Memory AS QMemoryStream
    Memory.CopyFrom(File, File.Size)  '-- Copia tutto
Come avrete notato, abbiamo copiato l'intero contenuto del nostro file 'test.txt' nel nostro flusso di memoria. Ora potete manipolare il flusso di memoria senza toccare il file.

7.3 Salvataggio/Caricamento di UDT e Matrici
Il salvataggio ed il caricamento di UDT è semplice come passare l'UDT ad un QFileStream o QMemoryStream.
    TYPE TTest
        S AS STRING*8
        N AS INTEGER
    END TYPE

    DIM Test AS TTest
    DIM File AS QFileStream

    File.Open('test.txt', fmCreate)
    File.WriteUDT(Test)
    File.Close
Nell'esempio precedente, sono stati salvati 12 byte nel file test.txt. Otto byte per la stringa S, e 4 per N. Per leggere l'UDT, utilizzare il metodo ReadUDT.
    File.Open('test.txt', fmOpenRead)
    File.ReadUDT(Test)
Il salvataggio ed il caricamento di matrici è altrettanto semplice.
    DIM A(1 TO 100) AS LONG
    DIM File AS QFileStream

    File.Open('test.txt', fmCreate)
    File.SaveArray(A(1), 100)
    File.Close
Il primo parametro di SaveArray è l'elemento iniziale della matrice da salvare, e nell'esempio precedente può essere qualunque valore da 1 a 100. Il parametro successivo specifica quanti elementi della matrice salvare. In questo caso abbiamo scelto di salvare tutti gli elementi da 1 a 100. Analogamente, possiamo utilizzare LoadArray per leggere i dati:
    File.Open('test.txt', fmOpenRead)
    File.LoadArray(A(1), 100)
Il flussi sono molto usati nella maggior parte dei linguaggi di alto livello per la manipolazione di file e memoria, ma non è facile abituarcisi, soprattutto per vecchi utenti Basic.