Differenze tra le versioni di "Fgets ()"

Da Gambas-it.org - Wikipedia.
 
Riga 3: Riga 3:
 
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.
 
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()|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.
+
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()|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 carattere 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:
 
Volendola utilizzare direttamente in Gambas, bisognerà dichiararla con ''Extern'', nonché dichiarare la libreria di C: ''libc.so.6'', nella quale la funzione è contenuta:
 
  Private <FONT Color=#B22222>Extern fgets</font>(__s As Pointer, __n As Integer, __stream As Pointer) As Pointer In "libc:6"
 
  Private <FONT Color=#B22222>Extern fgets</font>(__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):
 
Mostriamo di seguito un semplice esempio, nel quale si leggerà un qualsasi testo immesso nello ''standard input'' (dalla console/Terminale):
 
  Library "libc:6"
 
  Library "libc:6"
Riga 26: Riga 24:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim dest, p As Pointer
 
   Dim dest, p As Pointer
 
    
 
    
 
  <FONT Color=gray>' ''Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":''</font>
 
  <FONT Color=gray>' ''Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":''</font>
  p = fopen("/dev/stdin", "r")
+
  p = fopen("/dev/stdin", "r")
 
    
 
    
  dest = Alloc(SizeOf(gb.Byte), 64)
+
  dest = Alloc(SizeOf(gb.Byte), 64)
 
    
 
    
 
  <FONT Color=gray>' ''Il testo, letto dallo "standard input", verrà immesso nella variabile di tipo Puntatore "dest":''</font>
 
  <FONT Color=gray>' ''Il testo, letto dallo "standard input", verrà immesso nella variabile di tipo Puntatore "dest":''</font>
  <FONT Color=#B22222>fgets</font>(dest, 64, p)
+
  <FONT Color=#B22222>fgets</font>(dest, 64, p)
 
    
 
    
 
  <FONT Color=gray>' ''Verifichiamo il risultato dereferenziando il Puntatore "dest":''</font>
 
  <FONT Color=gray>' ''Verifichiamo il risultato dereferenziando il Puntatore "dest":''</font>
  Print "--> "; String@(dest)
+
  Print "--> "; String@(dest)
 
    
 
    
 
  <FONT Color=gray>' ''Libera la memoria precedentemente occupata:''</font>
 
  <FONT Color=gray>' ''Libera la memoria precedentemente occupata:''</font>
  Free(dest)
+
  Free(dest)
  fclose(p)
+
  fclose(p)
 
    
 
    
  '''End'''
+
  End
 
+
Un'altra modalità è con l'uso di una variabile vettoriale di tipo "Byte[]":
 
 
Un'altra modalità è con l'uso di una variabile vettoriale di tipo ''Byte[ ]'':
 
 
   Library "libc:6"
 
   Library "libc:6"
 
   
 
   
Riga 64: Riga 60:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim dest as New Byte[64]
 
   Dim dest as New Byte[64]
Riga 70: Riga 66:
 
    
 
    
 
  <FONT Color=gray>' ''Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":''</font>
 
  <FONT Color=gray>' ''Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":''</font>
  p = fopen("/dev/stdin", "r")
+
  p = fopen("/dev/stdin", "r")
 
      
 
      
 
  <FONT Color=gray>' ''Il testo, letto dallo "standard input", verrà immesso nell'area di memoria del vettore "dest" puntata dalla sua proprietà ".Data":''</font>
 
  <FONT Color=gray>' ''Il testo, letto dallo "standard input", verrà immesso nell'area di memoria del vettore "dest" puntata dalla sua proprietà ".Data":''</font>
  <FONT Color=#B22222>fgets</font>(dest.Data, 64, p)
+
  <FONT Color=#B22222>fgets</font>(dest.Data, 64, p)
 
    
 
    
  <FONT Color=gray>' ''Verifichiamo il risultato. Nel 2° argomento del Metodo ".ToString()" è necessario individuare la posizione del primo elemento''
+
  <FONT Color=gray>' ''Verifichiamo il risultato. Nel 2° argomento del Metodo ".ToString()" è necessario individuare la posizione del primo elemento del vettore, contenente il valore zero (&h00), affinché la stampa dei caratteri, contenuti dal vettore, si fermi all'ultimo carattere diverso da zero.''</font>
' ''del vettore, contenente il valore zero (&h00), affinché la stampa dei caratteri, contenuti dal vettore, si fermi all'ultimo carattere diverso da zero.''</font>
+
  Print "--> "; dest.ToString(0, dest.Find(0, 0))
  Print "--> "; dest.ToString(0, dest.Find(0, 0))
 
 
    
 
    
  <FONT Color=gray>' ''Libera la memoria precedentemente occupata e per garanzia fa puntare la variabile "p" alla cella numero zero:''</font>
+
  <FONT Color=gray>' ''Libera la memoria precedentemente occupata e per garanzia fa puntare la variabile "p" a un indirizzo non rilevante di memoria:''</font>
  fclose(p)
+
  fclose(p)
  p = 0
+
  p = 0
 
    
 
    
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 16:11, 14 giu 2024

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 carattere 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)
  
' Libera la memoria precedentemente occupata:
 Free(dest)
 fclose(p)
  
End

Un'altra modalità è con l'uso di una variabile vettoriale di tipo "Byte[]":

 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 as New Byte[64]
 Dim p As Pointer
 
' Apriamo in lettura lo "standard input" attraverso il suo file speciale individuato dal percorso "/dev/stdin":
 p = fopen("/dev/stdin", "r")
    
' Il testo, letto dallo "standard input", verrà immesso nell'area di memoria del vettore "dest" puntata dalla sua proprietà ".Data":
 fgets(dest.Data, 64, p)
 
' Verifichiamo il risultato. Nel 2° argomento del Metodo ".ToString()" è necessario individuare la posizione del primo elemento del vettore, contenente il valore zero (&h00), affinché la stampa dei caratteri, contenuti dal vettore, si fermi all'ultimo carattere diverso da zero.
 Print "--> "; dest.ToString(0, dest.Find(0, 0))
  
' Libera la memoria precedentemente occupata e per garanzia fa puntare la variabile "p" a un indirizzo non rilevante di memoria:
 fclose(p)
 p = 0
  
End


Riferimenti