NOMBRE¶
getline, getdelim - entrada de cadena delimitada
SINOPSIS¶
#define _GNU_SOURCE
#include <stdio.h>
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream);
DESCRIPCIÓN¶
getline() lee una línea entera, almacenando la dirección del
buffer que contiene el texto en
*lineptr. Al final del buffer se coloca
el valor null y además se incluye el carácter nueva línea si se
encontró el delimitador nueva línea.
Si
*lineptr es
NULL, la rutina
getline() reservará un
buffer para contener la línea, que debe ser liberado por el programa de
usuario. Alternativamente, antes de llamar a
getline(),
*lineptr
puede contener un puntero a un buffer reservado via
malloc() de
tamaño
*n bytes. Si el buffer no es lo suficientemente grande para
almacenar la línea leída,
getline() redimensiona el buffer
para que quepa con
realloc(), actualizando
*lineptr y
*n
si es necesario. En cualquier caso, si la llamada tiene éxito,
*lineptr y
*n serán actualizados para reflejar la
dirección del buffer y el tamaño respectivamente.
getdelim() funciona como
getline(), salvo que se puede especificar
otro delimitador de línea distinto de nueva línea en el argumento
delimiter. Como con
getline(), no se añade un carácter
delimitador si no hay ninguno presente en la entrada antes de que se alcanze
el fin del fichero.
VALOR DEVUELTO¶
En caso de éxito,
getline() y
getdelim() devuelven el
número de caracteres leídos, incluyendo el carácter
delimitador, pero sin incluir el carácter null del final. Este valor
puede usarse para manejar los carácters null embebidos en la línea
leída.
Ambas funciones devuelven -1 si fallan al leer una línea (incluyendo la
condición de fin de fichero).
ERRORES¶
- EINVAL
- Parámetros incorrectos (n o lineptr son
NULL, o stream no es válido).
EJEMPLO¶
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("/etc/motd", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
}
if (line)
free(line);
return EXIT_SUCCESS;
}
Tanto getline() como getdelim() son extensiones de GNU. Están disponibles
desde libc 4.6.27.
VÉASE TAMBIÉN¶
read(2),
fopen(3),
fread(3),
gets(3),
fgets(3),
scanf(3)