Este proyecto ha sido creado como parte del currículo de 42 por omarquez
El objetivo de get_next_line es leer un archivo descriptor de archivo (fd) y retornar una línea a la vez, gestionando de forma eficiente la memoria y el almacenamiento de los datos leídos.
Esta función es extremadamente útil para manejar la entrada de archivos de manera eficiente y controlada, permitiendo al usuario obtener una línea de texto a la vez hasta llegar al final del archivo (EOF).
- Gestión eficiente de la memoria para evitar fugas.
- Uso de variables estáticas para mantener el estado entre múltiples llamadas a la función.
- Compilador de C (como
gccoclang). - Sistema operativo tipo Unix (Linux o macOS).
makepara la compilación (si has incluido un Makefile).
Para probar la función, puedes compilarla junto con un programa de prueba y ademas necesitaras un archivo de texto para leer. El BUFFER_SIZE ya esta predefinido en el archivo de cabecera pero lo puedes redefinir con el flag -D BUFFER_SIZE=(int). Si tienes un archivo main.c para testear, utiliza el siguiente comando:
gcc -Wall -Wextra -Werror -D BUFFER_SIZE=42 get_next_line.c get_next_line_utils.c main.c -o gnlo podrias usar este codigo de ejemplo:
int main(void)
{
int fd;
char *line;
fd = open("nombre_del_archivo_a_leer", O_RDONLY);
if(fd == -1)
return (-1);
while((line = get_next_line(fd)))
{
printf("%s", line);
free(line);
}
close(fd);
return (0);
}Mis compañeros de el 42 Cursus me han ayudado:
-
@patperez, @ugarcia- y @francysa: en el reconocimiento del algoritmo a utilizar y entender el flujo del programa.
-
@xlopez-g y @mostoloz: en visualizar otra manera de hacer el ejercicio y me ha ayudado a entender el funcionamiento mas profundamente.
-
@khurtado: me ha ayudado haciendo peer-coding ayudandome a reconocer los errores de mi código.
-
[geeksforgeeks]https://www.geeksforgeeks.org/c/static-variables-in-c/ La use de introduccion al concepto de variables estaticas.
-
[geeksforgeeks]https://www.geeksforgeeks.org/c/input-output-system-calls-c-create-open-close-read-write/ Use este articulo para recordar el funcionamiento de las funciones read y open.
-
[learn.microsoft]https://learn.microsoft.com/es-es/cpp/preprocessor/hash-if-hash-elif-hash-else-and-hash-endif-directives-c-cpp?view=msvc-170 Use esta documentación para aprender a como crear una Macro y redefinirla.
- He utilizado la IA para la realización de este archivo README.md.
- Y también me ha ayudado a localizar algunos errores de fugas de memoria y de logica en mi codigo.
El núcleo del programa se basa en una variable estática (static char *store), la cual permite persistir los datos entre múltiples llamadas a la función. Dado que el sistema de archivos entrega datos en bloques de tamaño BUFFER_SIZE, esta variable actúa como un almacén temporal de residuos.
-
Fase de Lectura (
read_store):- Utiliza un bucle para leer bloques del archivo mediante
read()hasta que se encuentre un salto de línea (\n) o se alcance el final del archivo (EOF). - Los datos leídos se concatenan a la variable
storeutilizandoft_strjoin. - Se libera la memoria intermedia (
free) en cada iteración para evitar fugas.
- Utiliza un bucle para leer bloques del archivo mediante
-
Fase de Extracción (
ft_get_line):- Una vez que
storecontiene una línea completa, esta función escanea la cadena hasta encontrar\no\0. - Retorna una nueva cadena (mediante
malloc) que contiene únicamente la línea extraída.
- Una vez que
-
Fase de Actualización (
update_store):- Es el paso crítico para las llamadas sucesivas.
- Calcula el residuo sobrante tras la línea extraída y lo reasigna a
store. - La memoria antigua se libera, dejando
storepreparado únicamente con el contenido pendiente.
| Función | Responsabilidad |
|---|---|
get_next_line |
Función principal; orquesta la lectura, extracción y actualización del buffer. |
ft_read_store |
Lee desde el fd y acumula datos en la variable estática hasta encontrar un salto de línea. |
ft_get_line |
Aísla y extrae la línea de texto desde el buffer acumulado. |
ft_update_store |
Gestiona el "recorte" del buffer, eliminando la línea ya entregada y guardando el resto. |
ft_strjoin |
Une dos cadenas de caracteres gestionando dinámicamente la memoria. |
ft_substr |
Crea subcadenas necesarias para el manejo preciso de los punteros. |
El algoritmo ha sido diseñado para ser estricto en la gestión de memoria:
- Cada
mallocrealizado durante la concatenación o extracción tiene su correspondientefree. - El manejo de la variable estática
storeasegura que no se pierdan datos entre llamadas, permitiendo leer archivos de cualquier tamaño sin desbordar la pila. - El uso de
BUFFER_SIZEpermite ajustar la eficiencia de la lectura según el entorno de ejecución, definiéndose en tiempo de compilación.