Differenze tra le versioni di "Ottenere all'apertura di un file un Puntatore anziché una variabile di tipo File"

Da Gambas-it.org - Wikipedia.
Riga 9: Riga 9:
 
   
 
   
 
  <FONT Color=gray>' ''size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)''</font>
 
  <FONT Color=gray>' ''size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)''</font>
  Private Extern fread(ptr As Pointer, size As Integer, nmemb As Integer, fs As Pointer) As Integer
+
  Private Extern fread(ptr As Pointer, size As Long, nmemb As Long, stream_ As Pointer) As Long
 
   
 
   
 
  <FONT Color=gray>' ''size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)''</font>
 
  <FONT Color=gray>' ''size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)''</font>
  Private Extern fwrite(ptr As Byte[], size As Integer, nmemb As Integer, fs As Pointer) As Integer
+
  Private Extern fwrite(ptr As Pointer, size As Long, nmemb As Long, stream_ As Pointer) As Long
 +
 +
<FONT Color=gray>' ''int feof(FILE *stream)''</font>
 +
Private Extern fclose(stream_ As Pointer) As Integer
 
   
 
   
 
  <FONT Color=gray>' ''int fclose(FILE *stream)''</font>
 
  <FONT Color=gray>' ''int fclose(FILE *stream)''</font>
Riga 29: Riga 32:
 
   
 
   
 
  <FONT Color=gray>' ''Legge il file, ponendo i suoi byte in un vettore:''</font>
 
  <FONT Color=gray>' ''Legge il file, ponendo i suoi byte in un vettore:''</font>
   while True
+
   Do
     r = <FONT Color=#B22222>fread</font>(VarPtr(b), 1, 1, <FONT Color=#B22222>'''pf'''</font>)
+
     <FONT Color=#B22222>fread</font>(VarPtr(b), 1, 1, <FONT Color=#B22222>'''pf'''</font>)
     If r = 0 then Break
+
     If feof(pf) then Break
 
     bb.Add(b)
 
     bb.Add(b)
   Wend
+
   Loop
 
   
 
   
 
   <FONT Color=#B22222>fclose</font>(<FONT Color=#B22222>'''pf'''</font>)
 
   <FONT Color=#B22222>fclose</font>(<FONT Color=#B22222>'''pf'''</font>)
Riga 42: Riga 45:
 
   
 
   
 
  <FONT Color=gray>' ''Scrive i byte letti in un nuovo file:''</font>
 
  <FONT Color=gray>' ''Scrive i byte letti in un nuovo file:''</font>
   r = <FONT Color=#B22222>fwrite</font>(bb, bb.Count, 1, <FONT Color=#B22222>'''pf'''</font>)
+
   r = <FONT Color=#B22222>fwrite</font>(bb.Data, bb.Count, 1, <FONT Color=#B22222>'''pf'''</font>)
 
        
 
        
 
   <FONT Color=#B22222>fclose</font>(<FONT Color=#B22222>'''pf'''</font>)
 
   <FONT Color=#B22222>fclose</font>(<FONT Color=#B22222>'''pf'''</font>)
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 08:16, 10 set 2022

Come è noto, attualmente Gambas consente di gestire un file, aperto con l'istruzione Open ... For, attraverso una variabile di tipo File.
Se, invece, all'apertura di un file si intende ottenere, in modo particolare per operare con le funzioni esterne, una variabile di tipo Puntatore, per gestire tale file, anziché una variabile di tipo File, bisognerà utilizzare la funzione esterna "fopen()" della libreria di C. Conseguentemente, per la gestione del file attraverso il Puntatore, si useranno le altre funzioni di C capaci di gestire tale Puntatore.

Mostriamo un esempio essenziale:

Library "libc:6"

' FILE *fopen(const char *path, const char *mode)
Private Extern fopen(path As String, mode As String) As Pointer

' size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
Private Extern fread(ptr As Pointer, size As Long, nmemb As Long, stream_ As Pointer) As Long

' size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
Private Extern fwrite(ptr As Pointer, size As Long, nmemb As Long, stream_ As Pointer) As Long

' int feof(FILE *stream)
Private Extern fclose(stream_ As Pointer) As Integer

' int fclose(FILE *stream)
Private Extern fclose(fs As Pointer) As Integer


Public Sub Main()

 Dim pf As Pointer
 Dim b As Byte
 Dim bb As New Byte[]
 Dim r As Integer

' Apre il file in lettura:
 pf = fopen("/percorso/del/file/da/leggere", "rb")

' Legge il file, ponendo i suoi byte in un vettore:
 Do
   fread(VarPtr(b), 1, 1, pf)
   If feof(pf) then Break
   bb.Add(b)
 Loop

 fclose(pf)


' Apre il file in scrittura:
 pf = fopen("/percorso/del/file/da/scrivere", "wb")

' Scrive i byte letti in un nuovo file:
 r = fwrite(bb.Data, bb.Count, 1, pf)
      
 fclose(pf)

End