Fgets (): differenze tra le versioni
(Creata pagina con "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 cara...") |
Nessun oggetto della modifica |
||
| (4 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 1: | Riga 1: | ||
La funzione '''fgets()''', dichiarata nel file header "''stdio.h''" come segue: | La funzione '''fgets()''', dichiarata nel file header "''stdio.h''" come segue: | ||
char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) | char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) | ||
legge una linea di 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 | 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() | |||
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") | |||
dest = Alloc(SizeOf(gb.Byte), 64) | |||
<FONT Color=gray>' ''Il testo, | <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=gray>' ''Verifichiamo il risultato dereferenziando il Puntatore "dest":''</font> | <FONT Color=gray>' ''Verifichiamo il risultato dereferenziando il Puntatore "dest":''</font> | ||
Print "--> "; String@(dest) | |||
<FONT Color=gray>' ''Libera la memoria precedentemente occupata:''</font> | |||
Free(dest) | |||
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" a un indirizzo non rilevante di memoria:''</font> | |||
fclose(p) | |||
p = 0 | |||
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