Fread (): differenze tra le versioni
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 * | size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) | ||
legge da un flusso n blocchi ('' | 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>( | 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 | Private Enum SEEK_SET = 0, SEEK_CUR, SEEK_END | ||
Private Extern fopen( | Private Extern fopen(__filename As String, __modes As String) As Pointer | ||
Private Extern fwrite( | Private Extern fwrite(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long | ||
Private Extern fseek( | Private Extern fseek(streamp As Pointer, offset As Long, whence As Integer) As Integer | ||
<FONT color=gray>' ''size_t fread(void * | <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>( | Private Extern <FONT color=#B22222>fread</font>(__ptr As Pointer, __size As Long, __n As Long, __stream As Pointer) As Long | ||
Private Extern fclose( | 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 | Dim l As Long | ||
s = "Testo qualsiasi" | s = "Testo qualsiasi" | ||
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, | fwrite(pw, 1, l, p) | ||
fseek(p, 0, SEEK_SET) | fseek(p, 0, SEEK_SET) | ||
<FONT color=#B22222>fread(pr, 1, | <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;