Fgets ()

Da Gambas-it.org - Wikipedia.

La funzione fgets(), dichiarata nel file header "stdio.h" come segue:

char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)

legge una linea di massimo __n caratteri dal flusso, specificato nel suo terzo parametro, e lo memorizza nella stringa puntata dalla variabile del primo parametro. La lettura si ferma quando viene letto il carattere di "nuova riga a capo", oppure quando viene raggiunta la fine del file.

La funzione esterna fgets( ) può essere utilizzata anche per legere dallo standard input un testo qualsiasi ivi immesso. In tal caso, a differenza della funzione esterna scanf( ), che legge fino al carattere dello spazio (&h20), la funzione fgets( ) legge anche il carattere dello spazio, bloccandosi - come già detto sopra - solo se trova un caratere di "nuova riga a capo", oppure se viene raggiunta la fine del file.


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

Private Extern fgets(__s As Pointer, __n As Integer, __stream As Pointer) As Pointer In "libc:6"


Mostriamo di seguito un semplice esempio, nel quale si leggerà un qualsasi testo immesso nello standard input (dalla console/Terminale):

Library "libc:6"

' FILE *fopen (const char *__restrict __filename, const char *__restrict __modes)
' Open a file and create a new stream for it.
Private Extern fopen(__filename As String, __modes As String) As Pointer

' char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
' Get a newline-terminated string of finite length from STREAM.
Private Extern fgets(__s As Pointer, __n As Integer, __stream As Pointer) As Pointer

' int fclose (FILE *__stream)
' Close STREAM.
Private Extern fclose(filestream As Pointer) As Integer


Public Sub Main()
 
 Dim dest, p As Pointer
 
' Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":
  p = fopen("/dev/stdin", "r")
  
  dest = Alloc(SizeOf(gb.Byte), 64)
 
' Il testo, letto dallo "standard input", verrà immesso nella variabile di tipo Puntatore "dest":
  fgets(dest, 64, p)
 
' Verifichiamo il risultato dereferenziando il Puntatore "dest":
  Print "--> "; String@(dest)
  
  Free(dest)
  fclose(p)
  
End



Riferimenti