Read (): differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 45: | Riga 45: | ||
Dim bb As Byte[] | Dim bb As Byte[] | ||
<FONT Color=gray>' ''Per permettere che la funzione esterna "read_C" resti in attesa dell'immissione ed invio di uno o più caratteri,'' | <FONT Color=gray>' ''Per permettere che la funzione esterna "read_C" resti in attesa dell'immissione ed invio di uno o più caratteri,'' | ||
' ''è necessario utilizzare l'istruzione "For Input" (e non "For Read".''</font> | ' ''è necessario utilizzare l'istruzione "For Input" (e non "For Read", nel qual caso non vi sarà attesa).''</font> | ||
fl = Open "/dev/stdin" For <FONT color=#B22222>Input</font> | fl = Open "/dev/stdin" For <FONT color=#B22222>Input</font> | ||
bb = New Byte[16] | bb = New Byte[16] | ||
sz = <FONT color=#B22222>read_C</font>(fl.Handle, bb.Data, | sz = <FONT color=#B22222>read_C</font>(fl.Handle, bb.Data, bb.Count) | ||
Print | Print | ||
| Riga 60: | Riga 60: | ||
'''End''' | '''End''' | ||
Questo codice mostra come debba essere combinata l'istruzione "''Open''" nativa di Gambas con la funzione sterna di C "''read''". | Questo codice mostra come debba essere combinata l'istruzione "''Open''" nativa di Gambas con la funzione sterna di C "''read''". | ||
Da notare che se la dimensione del testo immesso è inferiore al valore espresso nel 3° parametro della funzione esterna "''read_C''", verrà aggiunto anche il carattere &h0A (nuova riga a capo). | |||
Versione delle 18:55, 4 ago 2017
La funzione read( ), dichiarata nel file header "/usr/include/unistd.h"
ssize_t read (int __fd, void *__buf, size_t __nbytes)
legge da un file usando il suo file descriptor (1° parametro) un numero di byte definito nel suo 3° parametro, memorizzandoli nel buffer stabilito nel 2° parametro.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta. Da sottolineare che, poiché questa funzione esterna di C "read( )" è omonima alla funzione di Gambas "Read", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando Exec.
Dunque avremo ad esempio:
Private Extern read_C(_fd As Integer, __buf As Pointer, __nbytes As Long) As Long In "libc:6" Exec "read"
Mostriamo un semplice esempio pratico, nel quale il programma leggerà quanto scritto nel Terminale dall'utente:
Private const STDIN as integer = 0 Library "libc:6" ' ssize_t read (int __fd, void *__buf, size_t __nbytes) ' Read NBYTES into BUF from FD. Private Extern read_C(__fd As Integer, __buf As Pointer, __nbytes As Long) As Long Exec "read" Public Sub Main() Dim bb As New Byte[16] read_C(STDIN, bb.Data, 16) Print String@(bb.Data) End
Un'altra modalità, per ottenere il medesimo risultato, può essere la seguente, nella quale in particolare si aprirà il file-device dello standard input mediante la ordinaria istruzione Open nativa di Gambas.
Library "libc:6" ' ssize_t read (int __fd, void *__buf, size_t __nbytes) ' Read NBYTES into BUF from FD. Private Extern read_C(__fd As Integer, __buf As Pointer, __nbytes As Long) As Long Exec "read" Public Sub Main() Dim fl As File Dim sz As Long Dim bb As Byte[] ' Per permettere che la funzione esterna "read_C" resti in attesa dell'immissione ed invio di uno o più caratteri, ' è necessario utilizzare l'istruzione "For Input" (e non "For Read", nel qual caso non vi sarà attesa). fl = Open "/dev/stdin" For Input bb = New Byte[16] sz = read_C(fl.Handle, bb.Data, bb.Count) Print Print bb.ToString(0, sz - 1) fl.Close End
Questo codice mostra come debba essere combinata l'istruzione "Open" nativa di Gambas con la funzione sterna di C "read".
Da notare che se la dimensione del testo immesso è inferiore al valore espresso nel 3° parametro della funzione esterna "read_C", verrà aggiunto anche il carattere &h0A (nuova riga a capo).