Differenze tra le versioni di "Fgets ()"
Riga 41: | Riga 41: | ||
Print "--> "; String@(dest) | Print "--> "; String@(dest) | ||
+ | <FONT Color=gray>' ''Libera la memoria precedentemente occupata:''</font> | ||
Free(dest) | Free(dest) | ||
fclose(p) | fclose(p) | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | Un'altra modalità è con l'uso di una variabile vettoriale di tipo ''Byte[ ]'': | ||
+ | Library "libc:6" | ||
+ | |||
+ | <FONT Color=gray>' ''FILE *fopen (const char *__restrict __filename, const char *__restrict __modes)'' | ||
+ | ' ''Open a file and create a new stream for it.''</font> | ||
+ | Private Extern fopen(__filename As String, __modes As String) As Pointer | ||
+ | |||
+ | <FONT Color=gray>' ''char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)'' | ||
+ | ' ''Get a newline-terminated string of finite length from STREAM.''</font> | ||
+ | Private Extern fgets(__s As Pointer, __n As Integer, __stream As Pointer) As Pointer | ||
+ | |||
+ | <FONT Color=gray>' ''int fclose (FILE *__stream)'' | ||
+ | ' ''Close STREAM.''</font> | ||
+ | Private Extern fclose(filestream As Pointer) As Integer | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim dest as New Byte[64] | ||
+ | Dim p As Pointer | ||
+ | |||
+ | <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") | ||
+ | |||
+ | <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=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> | ||
+ | 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> | ||
+ | fclose(p) | ||
+ | p = 0 | ||
'''End''' | '''End''' |
Versione delle 18:55, 30 mar 2018
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) ' 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" alla cella numero zero: fclose(p) p = 0 End