Skip to content

crlscb/get_next_line

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Este proyecto ha sido creado como parte del currículo de 42 por cescobio.

Get Next Line

Descripción

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 \n si existe.
  • Devuelve NULL cuando 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.


Instrucciones

Compilación

El proyecto debe compilar con:

cc -Wall -Werror -Wextra -D BUFFER_SIZE=42 *.c

El 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 *.c

Uso

Ejemplo 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);
    }
}

Explicación del Algoritmo

Concepto clave: variable estática

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.


Funcionamiento paso a paso

Lectura y acumulación (read_and_join)

  • Se reserva un buffer de tamaño BUFFER_SIZE.
  • Se llama a read() hasta:
    • Encontrar un \n
    • O llegar al final del archivo.
  • 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.


Extracción de la línea (extract_line)

  • Se recorre stash hasta encontrar \n.
  • Se reserva memoria para la línea.
  • Se copia la línea incluyendo el \n si existe.
  • Se devuelve la línea.

Limpieza del stash (clean_stash)

  • Se elimina del stash la línea ya devuelta.
  • Se conserva únicamente lo que queda después del \n.
  • Si no queda nada, se libera y devuelve NULL.

Gestión de Memoria

  • Todo malloc tiene su correspondiente free.
  • No hay memory leaks.
  • En caso de error de read, se libera el stash.
  • La memoria devuelta al usuario debe ser liberada por quien llame a la función.

Decisiones Técnicas

  • 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.

Comportamientos Especiales

  • Comportamiento indefinido si el archivo cambia mientras se está leyendo.
  • Comportamiento indefinido con archivos binarios.
  • Funciona correctamente con distintos valores de BUFFER_SIZE.

Estructura del Proyecto

get_next_line.c
get_next_line_utils.c
get_next_line.h

Recursos


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors