Differenze tra le versioni di "Seek"

Da Gambas-it.org - Wikipedia.
 
(13 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Il comando '''Seek''' imposta la posizione del puntatore interno ad un flusso (''stream''), definito mediante una variabile di tipo ''File'' o di tipo ''Stream'', per la successiva operazione di lettura (''Read'') o scrittura (''Write'') sul flusso medesimo.
 
Il comando '''Seek''' imposta la posizione del puntatore interno ad un flusso (''stream''), definito mediante una variabile di tipo ''File'' o di tipo ''Stream'', per la successiva operazione di lettura (''Read'') o scrittura (''Write'') sul flusso medesimo.
<BR>''Seek'' consente, pertanto, di leggere o di scrivere all'interno di un flusso di dati partendo dall'indice di un determinato byte.
+
<BR>''Seek'' consente di muovere il puntatore di lettura e/o scrittura in una qualunque posizione all'interno del file di dati, e pertanto consente di leggere e/o di scrivere in un flusso di dati partendo dall'indice di un determinato byte.
  
 
La sua sintassi è:
 
La sua sintassi è:
 
  Seek #Flusso, Posizione
 
  Seek #Flusso, Posizione
 
+
Poiché l'indice interno di un flusso di dati ha inizio da zero, per posizionare - ad esempio - il puntatore interno del flusso all'indice 0, ossia al ''primo'' byte, si dovrà impostare il valore di ''Posizione'' a zero:
 
 
 
 
Poiché l'indice interno di un flusso di dati ha inizio da zero, per posizionare il puntatore interno del flusso all'indice 0, ossia al ''primo'' byte, si dovrà impostare il valore di ''Posizione'' a zero:
 
 
  Seek #flusso, 0
 
  Seek #flusso, 0
  
 
Se il valore della posizione è negativo, allora il puntatore interno allo ''stream'' sarà spostato ad un indice calcolato partendo <SPAN style="text-decoration:underline">dalla fine</span> del flusso medesimo.
 
Se il valore della posizione è negativo, allora il puntatore interno allo ''stream'' sarà spostato ad un indice calcolato partendo <SPAN style="text-decoration:underline">dalla fine</span> del flusso medesimo.
  <FONT color=gray>' ''Sposta il puntatore interno dello stream di dieci byte partendo <SPAN style="text-decoration:underline">dalla fine</span> dello stream:''</font>
+
  <FONT color=gray>' ''Sposta il puntatore interno dello stream di dieci byte partendo a ritroso <SPAN style="text-decoration:underline">dalla fine</span> dello stream:''</font>
 
  Seek #flusso, -10
 
  Seek #flusso, -10
 +
Esempio:
 +
Public Sub Main()
 +
 +
  Dim fl As File
 +
  Dim s As String
 +
 +
  fl = Open "<FONT Color=darkgreen>''/percorso/del/file/da/leggere''</font>" For Read
 +
 +
  <FONT Color=#B22222>Seek</font> #fl, -5
 +
 +
  Read #fl, s, -256
 +
 +
  fl.Close
 +
 +
End
  
Per impostare il puntatore dopo la fine del flusso di dati, è necessario usare la funzione ''Lof()'':
+
===Impostare il puntatore dopo la fine del flusso di dati===
 +
Per impostare il puntatore dopo la fine del flusso di dati, è necessario usare la funzione "[[Lof|Lof()]]":
 
  <FONT color=gray>' ''Sposta il puntatore interno dello stream <SPAN style="text-decoration:underline">dopo</span> la fine dello stream:''</font>
 
  <FONT color=gray>' ''Sposta il puntatore interno dello stream <SPAN style="text-decoration:underline">dopo</span> la fine dello stream:''</font>
 
  Seek #flusso, Lof(#flusso)
 
  Seek #flusso, Lof(#flusso)
  
  
 
+
==Conoscere la posizione attuale del puntatore interno del flusso di dati==
===Conoscere la posizione attuale del puntatore interno del flusso di dati===
 
 
Il comando ''Seek'' consente anche di conoscere la posizione attuale del puntatore all'interno del flusso di dati.
 
Il comando ''Seek'' consente anche di conoscere la posizione attuale del puntatore all'interno del flusso di dati.
  
 
In tal caso la sua sintassi è:
 
In tal caso la sua sintassi è:
 
  Posizione = Seek(flusso)
 
  Posizione = Seek(flusso)
 
  
 
===Esempio pratico===
 
===Esempio pratico===
  
  '''Public Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
   Dim i, f As Integer
 
   Dim i, f As Integer
 
   
 
   
 +
  fl = Open "<FONT color=darkgreen>''/percorso/del/file''</font>" For Read Write
 
   
 
   
  fl = Open "''/percorso/del/file''" For Read Write
+
  Write #fl, 9 As Integer
 
  Write #fl, 9 As Integer
 
 
   
 
   
  Write #fl, 99 As Integer
+
  Write #fl, 99 As Integer
 
   
 
   
  <FONT color=gray>' ''Poiché le funzioni ''Write'' spostano, comunque, automaticamente il puntatore all'interno del flusso,''
+
  <FONT color=gray>' ''Poiché le funzioni "Write" spostano, comunque, automaticamente il puntatore all'interno del flusso, per leggere qualsiasi dei due valori, bisognerà utilizzare la funzione "Seek" impostandone la posizione in modo preciso.''
' ''per leggere quasiasi dei due valori, bisognerà utilizzare la funzione ''Seek'' impostandone la posizione in modo preciso.''
+
  ' ''Poiché il valore di tipo ''Integer'' occupa 4 byte, le due operazioni di scrittura con "Write" hanno prodotto anche lo spostamento di 8 byte complessivi in avanti del puntatore interno. Così, volendo leggere, ad esempio, il secondo valore (99) scritto nel file, bisognerà spostare il puntatore di 4 byte indietro; e quindi il valore sarà letto al byte di indice 4 (ossia al 5° byte) del file:''</font>
  ' ''Così, Per leggere, ad esempio, il secondo valore scritto nel file, poiché il valore di tipo ''Integer'' occupa 4 byte,''
+
  <FONT color=#B22222>Seek #fl, 4</font>
' ''bisognerà spostare di 4 byte il puntatore in avanti; e quindi il valore sarà letto al byte di indice 4 (ossia al 5° byte) del file:''</font>
 
  <FONT color=#B22222>Seek #fl, 4</font>
 
 
   
 
   
  Read #fl, i
+
  Read #fl, i
 
   
 
   
  Print i
+
  Print i
 
   
 
   
 +
<FONT color=gray>' ''Ora andiamo a vedere l'<SPAN style="text-decoration:underline">attuale</span> posizione del puntatore interno del flusso, tenendo presente che anche la funzione ''Read'' sposta automaticamente il puntatore all'interno del flusso:''</font>
 +
  f = <FONT color=#B22222>seek(fl)</font>
 
   
 
   
<FONT color=gray>' ''Ora andiamo a vedere l'<SPAN style="text-decoration:underline">attuale</span> posizione del puntatore interno del flusso,''
+
  Print f  <FONT color=gray>' ''Il risultato sarà 8 = 4 (l'indice impostato con "Seek") + 4 (...giacché abbiamo letto un valore di tipo Integer)''</font>
' ''tenendo presente che anche la funzione ''Read'' sposta automaticamente il puntatore all'interno del flusso:''</font>
 
  f = <FONT color=#B22222>seek(fl)</font>
 
 
   
 
   
  Print f   <FONT color=gray>' ''Il risultato sarà 8''</font>
+
   fl.Close
 
   
 
   
  '''End'''
+
  End

Versione attuale delle 14:45, 10 giu 2024

Il comando Seek imposta la posizione del puntatore interno ad un flusso (stream), definito mediante una variabile di tipo File o di tipo Stream, per la successiva operazione di lettura (Read) o scrittura (Write) sul flusso medesimo.
Seek consente di muovere il puntatore di lettura e/o scrittura in una qualunque posizione all'interno del file di dati, e pertanto consente di leggere e/o di scrivere in un flusso di dati partendo dall'indice di un determinato byte.

La sua sintassi è:

Seek #Flusso, Posizione

Poiché l'indice interno di un flusso di dati ha inizio da zero, per posizionare - ad esempio - il puntatore interno del flusso all'indice 0, ossia al primo byte, si dovrà impostare il valore di Posizione a zero:

Seek #flusso, 0

Se il valore della posizione è negativo, allora il puntatore interno allo stream sarà spostato ad un indice calcolato partendo dalla fine del flusso medesimo.

' Sposta il puntatore interno dello stream di dieci byte partendo a ritroso dalla fine dello stream:
Seek #flusso, -10

Esempio:

Public Sub Main()

 Dim fl As File
 Dim s As String

 fl = Open "/percorso/del/file/da/leggere" For Read

 Seek #fl, -5

 Read #fl, s, -256

 fl.Close

End

Impostare il puntatore dopo la fine del flusso di dati

Per impostare il puntatore dopo la fine del flusso di dati, è necessario usare la funzione "Lof()":

' Sposta il puntatore interno dello stream dopo la fine dello stream:
Seek #flusso, Lof(#flusso)


Conoscere la posizione attuale del puntatore interno del flusso di dati

Il comando Seek consente anche di conoscere la posizione attuale del puntatore all'interno del flusso di dati.

In tal caso la sua sintassi è:

Posizione = Seek(flusso)

Esempio pratico

Public Sub Main()

 Dim fl As File
 Dim i, f As Integer

 fl = Open "/percorso/del/file" For Read Write

 Write #fl, 9 As Integer

 Write #fl, 99 As Integer

' Poiché le funzioni "Write" spostano, comunque, automaticamente il puntatore all'interno del flusso, per leggere qualsiasi dei due valori, bisognerà utilizzare la funzione "Seek" impostandone la posizione in modo preciso.
' Poiché il valore di tipo Integer occupa 4 byte, le due operazioni di scrittura con "Write" hanno prodotto anche lo spostamento di 8 byte complessivi in avanti del puntatore interno. Così, volendo leggere, ad esempio, il secondo valore (99) scritto nel file, bisognerà spostare il puntatore di 4 byte indietro; e quindi il valore sarà letto al byte di indice 4 (ossia al 5° byte) del file:
 Seek #fl, 4

 Read #fl, i

 Print i

' Ora andiamo a vedere l'attuale posizione del puntatore interno del flusso, tenendo presente che anche la funzione Read sposta automaticamente il puntatore all'interno del flusso:
 f = seek(fl)

 Print f   ' Il risultato sarà 8 = 4 (l'indice impostato con "Seek") + 4 (...giacché abbiamo letto un valore di tipo Integer)

 fl.Close

End