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)