funcion - ¿Por qué la función Fgets está obsoleta?
gets c file (2)
Del tutorial de programación de GNU C :
La
fgets
("file get string") es similar a la función gets. Esta función está obsoleta, es decir, está obsoleta y se recomienda encarecidamente que no la use, porque es peligrosa. Es peligroso porque si los datos de entrada contienen un carácter nulo, no se puede saber. No usefgets
menos que sepa que los datos no pueden contener un nulo. No lo use para leer archivos editados por el usuario porque, si el usuario inserta un carácter nulo, debe manejarlo correctamente o imprimir un mensaje de error claro. Siempre usegetline
ogetdelim
lugar defgets
si puede.
Pensé que la función fgets
detiene cuando encuentra un /0
o /n
; ¿Por qué esta página de manual sugiere que un byte nulo es "peligroso" cuando los fgets
deben manejar la entrada correctamente? Además, ¿cuál es la diferencia entre getline
y fgets
, y la función fgets
realmente se considera obsoleta en el C99 o en los futuros estándares de C?
Esto es solo propaganda de GNU. En ningún sentido oficial es fgets
obsoleto. sin embargo, es peligroso y obsoleto.
No, fgets
no está actualmente en desuso en C99 o en el estándar actual, C11. Pero el autor de ese tutorial tiene razón en que los fgets
no se detendrán cuando encuentren un NUL, y no tiene ningún mecanismo para informar su lectura de dicho personaje.
La función
fgets
lee a lo sumo uno menos que la cantidad de caracteres especificada porn
desde la secuencia a la que apunta lastream
en la matriz apuntada pors
. No se leen caracteres adicionales después de un carácter de nueva línea (que se conserva) o después del final del archivo.
(§7.21.7.2)
Los getdelim
y getline
GNU se han estandarizado en POSIX 2008 , por lo que si se orienta a una plataforma POSIX, entonces no sería una mala idea usarlos en su lugar.
EDITAR : Pensé que no había absolutamente ninguna forma segura de usar los fgets
frente a los caracteres NUL, pero R .. (ver comentarios) señaló que hay:
char buf[256];
memset(buf, ''/n'', sizeof(buf)); // fgets will never write a newline
fgets(buf, sizeof(buf), fp);
Ahora busca el último carácter no /n
en buf
. Sin embargo, en realidad no recomendaría este kludge.