Pregunta ¿Por qué fgets acepta un int en lugar de un size_t?


Funciones tales como strcpy(), malloc(), strlen() y varios otros aceptan sus argumentos o devuelven valores como size_t en lugar de un int o un unsigned int por obvias razones.

Algunas funciones de archivo como fread() y fwrite() utilizar size_t también. Por extensión, se esperaría que char* fgets (char *str, int num, FILE *stream) debería usar un size_t y no un int como argumento para su tamaño de búfer.

Sin embargo, fgets() usa una int. ¿Hay alguna explicación objetiva por qué?


11
2017-08-02 11:53


origen


Respuestas:


El original K & R definido fgets() en la p.155 con un int argumento. El código presentado en el libro habría funcionado con un unsigned int también (usa un >0, pero el ciclo está escrito para nunca ir por debajo de cero).

size_t se introdujo más tarde, en C89 (ANSI C), como el tipo de sizeof(). Como esta característica se introdujo específicamente para armonizar la asignación de memoria, la memoria las funciones de gestión y las funciones de cadena se actualizaron en consecuencia. Pero la E / S de archivo no era: las únicas funciones de archivo que se usaban size_t en C89 son esos nuevos introducido por C89 y no existía en K & R como, por ejemplo, fread()/fwrite(). Sí, K & R no tenía estas funciones y se basó para operaciones de bloque solo en funciones de lectura / escritura de Unix no portátiles usando descriptores de archivos.

Cabe señalar que Estándar POSIX, que ha armonizado las funciones de Unix, se desarrolló en paralelo a el estándar ANSI C y emitido a fines de 1988. Esta norma ha armonizado muchas funciones de Unix para usar size_t así que eso read()/write() hoy en día se definen con size_t. Pero para las funciones de la biblioteca estándar C, como fgets(), POSIX da prioridad al estándar C (redacción de la versión actual de la norma):

La funcionalidad descrita en esta página de referencia está alineada con el estándar ISO C.   Cualquier conflicto entre los requisitos descritos aquí y el estándar ISO C es involuntario.

Entonces en POSIX también, irónicamente, fgets() todavía heredado de su histórico K & R int.


Editar: lectura adicional

stdio.h:  Este encabezado define y crea prototipos de la mayoría de las funciones enumeradas en el Capítulo 7 de K & R. Pocos cambios, si acaso, se realizaron en el   definiciones encontradas en K & R pero se han agregado varias funciones nuevas.


9
2017-08-02 15:23