Métodos
42 (II): get_next_line, leer ficheros línea a línea
Buffers estáticos y memoria entre llamadas: el proyecto que enseña qué pasa realmente cuando leemos un fichero.

De pequeños, todos hemos leído ficheros línea a línea en algún lenguaje: readline, fgets, lo que sea. En 42 eso no existe: tienes read, un descriptor de fichero y tu capacidad de organizar la memoria. El proyecto se llama get_next_line: una función que, llamada en bucle, devuelve una línea de cada vez de un fichero cualquiera.
El problema
La dificultad no es leer: es devolver exactamente hasta el salto de línea cuando read trabaja con bloques. La función lee del fichero en trozos de un tamaño fijo (BUFFER_SIZE, que en las pruebas puede cambiar), y una línea puede ser más corta que el bloque, mucho más larga, o acabar sin salto al final del fichero. Además, entre llamada y llamada tienes que recordar por dónde te quedaste, y en la parte bonus, hacerlo con varios ficheros abiertos a la vez sin mezclarlos. Y todo sin ninguna fuga de memoria, porque cada byte cuenta.
Cómo lo abordé
La pieza central es un buffer estático: una zona de memoria que sobrevive entre llamadas y guarda lo que has leído y aún no has consumido. Cada llamada, la función mira si en el buffer ya hay una línea completa; si no la hay, vuelve a leer del fichero y lo añade; cuando aparece el salto de línea, recorta la línea, la devuelve y deja el resto en el buffer para la siguiente. Suena sencillo, pero el detalle escondido es la variedad de casos: ficheros vacíos, varias líneas vacías seguidas, la última línea sin salto… Me hice mis propios ficheros de prueba —uno con líneas cortas, uno con una línea kilométrica, uno vacío— y probé con BUFFER_SIZE de 1 hasta valores enormes para comprobar que el comportamiento era siempre el mismo. También guardé una versión comentada del código para estudiarla con calma: en el repositorio, 42_get_next_line, conviven la versión obligatoria, la bonus y varios mains de prueba.
Qué me llevé
Este proyecto me cambió la relación con read: antes era «la llamada que lee ficheros»; ahora sé que lee bytes en bloques, que puede devolver menos de los que pides y que la shell, los scripts y todo lo demás viven sobre esa mecánica. También me dejó claro el valor de una variable estática bien entendida y, sobre todo, el hábito de probar los casos que no salen en el subject. Hay una satisfacción concreta en ver el mismo código leer bien un fichero con líneas de un carácter y otra de un millón.