Necesito leer una línea de texto (terminada por una nueva línea) sin hacer suposiciones sobre la longitud. Así que ahora se enfrentan a posibilidades:C fgets versus fgetc para leer la línea
- Uso
fgets
y comprobar cada vez si el último carácter es un salto de línea y añadir de forma continua a un búfer - Lea cada carácter utilizando
fgetc
y ocasionalmenterealloc
el buffer
La intuición me dice que la variante fgetc
puede ser más lenta, pero de nuevo no veo cómo fgets
puede hacerlo sin examinar todos los caracteres (también mi intuición no siempre es tan buena). Las líneas son bastante grandes, por lo que el rendimiento es importante.
Me gustaría saber los pros y los contras de cada enfoque. Gracias de antemano.
La única limitación al implementar una función 'getline' con' fgets' es que es imposible manejar bytes nulos ** y ** archivos que no terminan con un carácter de nueva línea al mismo tiempo. Si 'fgets' encuentra una condición EOF y regresa sin un carácter de nueva línea, solo puede suponer que la cadena termina en el primer byte nulo. (En otros casos, puede hacer 'strchr (buf, '\ n')' para averiguar dónde se detuvo la lectura, o si no hay ''\ n'', debe' realloc'.) – mk12
Si el el archivo contiene bytes nulos, no es un archivo de texto. (Puede ser un archivo de caracteres anchos, pero luego necesita usar funciones de E/S de caracteres anchos para leerlo). Y 'fgets()' no está diseñado para manejar archivos que contienen bytes nulos, precisamente porque no da un indicación confiable de cuántos bytes leyó. Si su archivo de datos contiene bytes nulos, debería (probablemente) no usar 'fgets()' para leerlo. –
http://linux.die.net/man/3/getline (sección Valor de retorno) parece sugerir que podría ser una cosa útil. De ahí saqué la idea, aunque supongo que estoy de acuerdo contigo. Ahora que lo pienso, tal vez solo se mencione allí porque podría ser útil al usar un delimitador que no sea ''\ n''. – mk12