Fread (): differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
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 08: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;