lunes, 21 de marzo de 2016

getline y getdelim: alternativas a gets o fgets

Quiero leer archivos de texto linea a linea, desconozco el largo de la linea. Esto es útil tenerlo encapsulado en una función para procesar archivos de log u otros archivos con lineas de largo variable, usuales en sistemas que intercambian información mediante archivos de texto.

La función gets(3), deprecada por largo tiempo, no es una buena opción. Si la linea es mas larga que el buffer, esta función permite leer mas allá del final del buffer que recibe como parámetro. Esto se explotado para romper la seguridad de una computadora, en ataques de desbordamiento de buffers

La función fgets(3), es un remplazo "seguro" de gets. Esta función lee hasta que el buffer se llene o encuentre el fin de linea. Si la linea es más larga que el buffer, va a ser necesario otra lectura. Y no tenemos certeza de saber si la función terminó por llegar al final de la linea o por que se llenó el buffer.

Buscando mejores alternativas encontré las funciones de biblioteca getline(3) y getdelim(3). Originalmente ambas funciones eran extensiones del proyecto GNU a la glibc. Fueron integradas al standard POSIX a partir de la revisión POSIX.1-2008. Reciben como parámetros un puntero a un buffer, puntero al tamaño inicial del mismo y un puntero FILE al archivo que se quiere leer. Adicionalmente getdelim recibe un carácter que se utilizará como fin de lectura (en vez de '\n'). Si el buffer no resulta suficiente para completar la lectura, la función lo agranda llamando a realloc(3), actualizando el valor del tamaño del mismo.

Estas funciones son una buena opción para leer archivos con lineas de largo variable o desconocido. Incluso, con algo de cuidado, se pueden leer archivos creados en otros sistemas operativos (Windows/MS-DOS). En la manpage hay un ejemplo de uso.

No hay comentarios:

Publicar un comentario