type library functions c c-standard-library

library - ¿Cuál es la diferencia entre fgetpos/fsetpos y ftell/fseek?



file library c (4)

Bueno, desde la página del manual podemos ver que ftell y fseek usan el tipo long int para representar las compensaciones (posiciones) en un archivo, y por lo tanto pueden estar limitadas a las compensaciones que pueden representarse en una int larga. (No se garantiza que el tipo long int tenga valores mayores a 2 ** 31-1, limitando el desplazamiento máximo a 2 gigabytes). Las nuevas funciones fgetpos y fsetpos, por otro lado, utilizan un typedef especial, fpos_t, para representar las compensaciones. El tipo detrás de este typedef, si se elige apropiadamente, puede representar compensaciones arbitrariamente grandes, por lo que fgetpos y fsetpos pueden usarse con archivos arbitrariamente grandes. fgetpos y fsetpos también registran el estado asociado con los flujos multibyte.

¿Cuál es la diferencia entre usar las funciones fgetpos() y fsetpos() y usar las funciones ftell() y fseek() para obtener y establecer una posición en un archivo?

¿ fgetpos() qué sirven los fgetpos() y fsetpos() ? ¿Por qué se usarían en lugar de ftell() y fseek() ?


No hay diferencia en la funcionalidad, aunque las interfaces se definen de manera diferente. Ambos están implementados porque ambos son parte de POSIX.


fgetpos () va con fsetpos (). Y ftell () va con fseek ().

fgetpos () se parece prácticamente a ftell () porque ambos toman un parámetro FILE * y ambos devuelven algún tipo de posición en el archivo, aunque con un estilo ligeramente diferente. Pero vea esto: SOLAMENTE fseek () le permite buscar desde el principio del archivo, desde su posición actual en el archivo, y hacia atrás desde el final del archivo (el tercer argumento de fseek () es SEEK_SET, SEEK_CUR, y SEEK_END ). fsetpos () no hace esto. fsetpos () se limita a volver a alguna posición que obtuviste de fgetpos ().

Digamos que quiere leer un archivo en la memoria. ¿Cuánto montón necesitas de malloc ()? Necesitas el tamaño del archivo. Y aún no he encontrado ninguna función en la biblioteca estándar de C que le indique el tamaño de un archivo, aunque algunos compiladores de C pueden agregar una función no estándar. Por ejemplo, Borland Turbo C tenía filelength (). Pero no he visto filelength () entre la biblioteca de STANDARD C.

Entonces, lo que puede hacer es usar fseek () a 0 bytes antes del FIN del archivo. Luego use ftell () para obtener la posición en bytes, y base su cálculo para la cantidad de memoria del montón en eso.

¿Qué más podrías hacer para obtener el tamaño del archivo? Puedes usar fgetc () para leer cada personaje, contando hasta que llegues al final. Pero creo que usar fseek () y ftell () es mejor y más fácil.


Ninguna de las respuestas anteriores es correcta : de hecho, si utiliza fsetpos intercambiable con fseek , podría introducir un error de seguridad ( https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=20087255 ).

La razón es que el argumento fpos_t *pos de fsetpos no es en realidad un entero, por lo que no se puede utilizar para buscar ubicaciones arbitrarias en un archivo. Los únicos valores válidos son, por lo tanto, los obtenidos de fgetpos . Como dicen los doctores,

El indicador de posición del archivo interno asociado con el flujo se establece en la posición representada por pos , que es un puntero a un objeto fpos_t cuyo valor se habrá obtenido previamente mediante una llamada a fgetpos .

( http://www.cplusplus.com/reference/cstdio/fsetpos/ )

Si todo lo que desea es la posibilidad de buscar ubicaciones arbitrarias más allá del límite de 32 bits, use ftello / fseeko y compile con #define _FILE_OFFSET_BITS 64 .