Differenze tra le versioni di "Fread ()"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La funzione della libreria di C
 
La funzione della libreria di C
  size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
+
  size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)
legge da un flusso n blocchi (''nmemb'') di dati, aventi ciascuno una dimensione di ''size'' byte, memorizzandoli nel buffer puntato da un Puntatore (''ptr''). Ritorna il numero di byte letti dal flusso.
+
legge da un flusso n blocchi (''__n'') di dati, aventi ciascuno una dimensione di ''__size'' byte, memorizzandoli nel buffer puntato da un Puntatore (''__ptr''). Ritorna il numero di byte letti dal flusso.
  
  
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
 
Volendola utilizzare in Gambas, bisognerà dichiararla con ''Extern'', nonché bisognerà dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
  Private <FONT color=#B22222>Extern fread</font>(ptr As Pointer, size As Integer, nmemb As Integer, streamp As Pointer) As Integer In "libc:6"
+
  Private <FONT color=#B22222>Extern fread</font>(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long In "libc:6"
  
  
Riga 12: Riga 12:
 
  Library "libc:6"
 
  Library "libc:6"
 
   
 
   
  Private Const SEEK_SET As Integer = 0
+
  Private Enum SEEK_SET = 0, SEEK_CUR, SEEK_END
 
   
 
   
  Private Extern fopen(fl As String, mode As String) As Pointer
+
  Private Extern fopen(__filename As String, __modes As String) As Pointer
 
   
 
   
  Private Extern fwrite(ptr As Pointer, size As Integer, nmemb As Integer, filestream As Pointer) As Integer
+
  Private Extern fwrite(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long
 
   
 
   
  Private Extern fseek(filestream As Pointer, offset As Long, whence As Integer) As Integer
+
  Private Extern fseek(streamp As Pointer, offset As Long, whence As Integer) As Integer
 
   
 
   
  <FONT color=gray>' ''size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)''
+
  <FONT color=gray>' ''size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)''
 
  ' ''Read chunks of generic data from STREAM.''</font>
 
  ' ''Read chunks of generic data from STREAM.''</font>
  Private Extern <FONT color=#B22222>fread</font>(ptr As Pointer, size As Integer, nmemb As Integer, streamp As Pointer) As Integer
+
  Private Extern <FONT color=#B22222>fread</font>(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long
 
   
 
   
  Private Extern fclose(filestream As Pointer) As Integer
+
  Private Extern fclose(__stream As Pointer) As Integer
 
   
 
   
 
   
 
   
Riga 31: Riga 31:
 
   Dim p, pw, pr As Pointer
 
   Dim p, pw, pr As Pointer
 
   Dim s As String
 
   Dim s As String
   Dim i As Integer
+
   Dim l As Long
 
      
 
      
 
   s = "Testo qualsiasi"
 
   s = "Testo qualsiasi"
   i = len(s)
+
   l = len(s)
 
    
 
    
 
   pw = Alloc(s)
 
   pw = Alloc(s)
Riga 41: Riga 41:
 
   p = fopen("/tmp/f", "w+")
 
   p = fopen("/tmp/f", "w+")
 
    
 
    
   fwrite(pw, 1, i, p)
+
   fwrite(pw, 1, l, p)
 
    
 
    
 
   fseek(p, 0, SEEK_SET)
 
   fseek(p, 0, SEEK_SET)
 
   
 
   
   <FONT color=#B22222>fread(pr, 1, i, p)</font>
+
   <FONT color=#B22222>fread(pr, 1, l, p)</font>
 
          
 
          
 
   Print String@(pr)
 
   Print String@(pr)
Riga 56: Riga 56:
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
  
  

Versione delle 07:11, 9 set 2016

La funzione della libreria di C

size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)

legge da un flusso n blocchi (__n) di dati, aventi ciascuno una dimensione di __size byte, memorizzandoli nel buffer puntato da un Puntatore (__ptr). Ritorna il numero di byte letti dal flusso.


Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché bisognerà dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:

Private Extern fread(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long In "libc:6"


Semplice esempio uso in Gambas in combinazione con le funzioni fwrite(), fseek() e fclose():

Library "libc:6"

Private Enum SEEK_SET = 0, SEEK_CUR, SEEK_END

Private Extern fopen(__filename As String, __modes As String) As Pointer

Private Extern fwrite(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long

Private Extern fseek(streamp As Pointer, offset As Long, whence As Integer) As Integer

' size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)
' Read chunks of generic data from STREAM.
Private Extern fread(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long

Private Extern fclose(__stream As Pointer) As Integer


Public Sub Main()
 
 Dim p, pw, pr As Pointer
 Dim s As String
 Dim l As Long
    
  s = "Testo qualsiasi"
  l = len(s)
  
  pw = Alloc(s)
  pr = Alloc(SizeOf(gb.Byte) *  i)
 
  p = fopen("/tmp/f", "w+")
 
  fwrite(pw, 1, l, p)
  
  fseek(p, 0, SEEK_SET)

  fread(pr, 1, l, p)
       
  Print String@(pr)
 
  fclose(p)
  
' Libera la memoria precedentemente allocata:
  Free(pw)
  Free(pr)

End



Analogia di funzionamento fra le funzioni fread() e fwrite() con i metodi .Read() e .write() dei vettori in Gambas

Fra le funzioni fread(), fwrite() ed i metodi .Read() e .write() dei vettori in Gambas sussiste un'analogia di funzionamento.

Infatti analizzando il codice seguente:

Public Sub Main()

 Dim bb As Byte[]
 Dim fl, ex As File
 
  fl = Open "/percorso/del/file/da/leggere" For Read
  ex = Open "/percorso/del/file/da/scrivere" For Create
   
  With bb = New Byte[](Lof(fl))
    .Read(fl, 0, Lof(fl))
    .Write(ex, 0, Lof(fl))
  End With
 
  fl.Close
  ex.Close

End

possiamo notare che:

  • il buffer di tipo Puntatore, presente come primo parametro delle funzioni fread() e fwrite() di C, corrisponde alla variabile vettoriale "bb";
  • il secondo parametro delle due funzioni esterne di C, corrisponde al terzo parametro dei metodi .read() e .write() della variabile vettoriale;
  • il quarto parametro delle due funzioni esterne di C, corrisponde sostanzialmente al primo parametro dei due metodi della variabile vettoriale;