Este proyecto ha sido creado como parte del currículo de 42 por cescobio.
Get Next Line es el segundo proyecto del cursus de 42Madrid cuyo objetivo es implementar la función:
char *get_next_line(int fd);Esta función permite leer un archivo línea a línea desde un file descriptor (fd).
Cada llamada a get_next_line() devuelve:
- La siguiente línea del archivo.
- Incluye el carácter
\nsi existe. - Devuelve
NULLcuando no hay más contenido que leer o si ocurre un error.
El proyecto introduce el concepto de variables estáticas en C, permitiendo conservar información entre llamadas sucesivas a la función.
El proyecto debe compilar con:
cc -Wall -Werror -Wextra -D BUFFER_SIZE=42 *.cEl flag -D BUFFER_SIZE=n define el tamaño del buffer utilizado en cada llamada a read().
Debe funcionar:
- Con
BUFFER_SIZE=1 - Con valores grandes
- Con y sin definir
BUFFER_SIZE(usando un valor por defecto)
Ejemplo sin flag:
cc -Wall -Werror -Wextra *.cEjemplo de uso:
#include <fcntl.h>
#include <stdio.h>
#include "get_next_line.h"
int main(void)
{
int fd = open("test.txt", O_RDONLY);
char *line;
while ((line = get_next_line(fd)))
{
printf("%s", line);
free(line);
}
}Se utiliza una variable estática dentro de get_next_line:
static char *stash;Esto permite conservar los datos leídos entre llamadas sucesivas.
Sin static, la función perdería el contenido pendiente en cada llamada.
- Se reserva un buffer de tamaño
BUFFER_SIZE. - Se llama a
read()hasta:- Encontrar un
\n - O llegar al final del archivo.
- Encontrar un
- El contenido leído se acumula en
stash. - Se libera el buffer.
La función nunca lee más de lo necesario: si ya hay un salto de línea en stash, no sigue leyendo.
- Se recorre
stashhasta encontrar\n. - Se reserva memoria para la línea.
- Se copia la línea incluyendo el
\nsi existe. - Se devuelve la línea.
- Se elimina del
stashla línea ya devuelta. - Se conserva únicamente lo que queda después del
\n. - Si no queda nada, se libera y devuelve
NULL.
- Todo
malloctiene su correspondientefree. - No hay memory leaks.
- En caso de error de
read, se libera elstash. - La memoria devuelta al usuario debe ser liberada por quien llame a la función.
- Se dividió la lógica en múltiples funciones para cumplir Norminette.
read_and_join()se separó para evitar funciones demasiado largas.- Las funciones auxiliares se movieron a
get_next_line_utils.c. - No se usan variables globales.
- No se usa
libft.
- Comportamiento indefinido si el archivo cambia mientras se está leyendo.
- Comportamiento indefinido con archivos binarios.
- Funciona correctamente con distintos valores de
BUFFER_SIZE.
get_next_line.c
get_next_line_utils.c
get_next_line.h
man 2 readman 3 malloc- Documentación sobre variables estáticas en C
- Vídeo explicativo variables estáticas
- Tester libft