Fread (): differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 5: | Riga 5: | ||
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, | Private <FONT color=#B22222>Extern fread</font>(ptr As Pointer, size As Integer, nmemb As Integer, streamp As Pointer) As Integer In "libc:6" | ||
| Riga 22: | Riga 22: | ||
<FONT color=gray>' ''size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)'' | <FONT color=gray>' ''size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)'' | ||
' ''Read chunks of generic data from STREAM.''</font> | ' ''Read chunks of generic data from STREAM.''</font> | ||
Private <FONT color=#B22222>Extern fread</font>(ptr As Pointer, size As Integer, nmemb As Integer, | Private <FONT color=#B22222>Extern fread</font>(ptr As Pointer, size As Integer, nmemb As Integer, streamp As Pointer) As Integer | ||
Private Extern fclose(filestream As Pointer) As Integer | Private Extern fclose(filestream As Pointer) As Integer | ||
Versione delle 18:01, 8 set 2016
La funzione della libreria di C
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *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.
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 Integer, nmemb As Integer, streamp As Pointer) As Integer In "libc:6"
Semplice esempio uso in Gambas in combinazione con le funzioni fwrite(), fseek() e fclose():
Library "libc:6"
Private Const SEEK_SET As Integer = 0
Private Extern fopen(fl As String, mode As String) As Pointer
Private Extern fwrite(ptr As Pointer, size As Integer, nmemb As Integer, filestream As Pointer) As Integer
Private Extern fseek(filestream As Pointer, offset As Long, whence As Integer) As Integer
' size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
' Read chunks of generic data from STREAM.
Private Extern fread(ptr As Pointer, size As Integer, nmemb As Integer, streamp As Pointer) As Integer
Private Extern fclose(filestream As Pointer) As Integer
Public Sub Main()
Dim p, pw, pr As Pointer
Dim s As String = "Testo qualsiasi"
' Poiché la variabile contenente i dati da scrivere nel flusso, e la variabile, nella quale si dovranno memorizzare i dati letti dal flusso,
' sono di tipo "Puntatore", allora anche nel codice Gambas si dovranno passare delle variabili di tipo "Puntatore":
pw = Alloc(s)
pr = Alloc(len(s))
p = fopen("/tmp/f", "w+")
fwrite(pw, 1, len(s), p)
fseek(p, 0, SEEK_SET)
fread(pr, 1, len(s), p)
Print String@(pr)
fclose(p)
free(pw)
free(pr)
End
Analogia 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 una stretta 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;