Pregunta

Mi pregunta anterior es sobre la lectura de datos en bruto y la escritura, pero un nuevo problema arised, parece que no hay fin ....

La pregunta es: los parámetros de las funciones como lseek() o fseek() son los 4 bytes. Si quiero que pasemos un lapso de más de 4G, esto es imposible. Sé que en Win32, hay una SetPointer(...,Hign, Low,....) función, esta punteros pueden generar 64 punteros de bytes, que es lo que quiero.

Pero si quiero crear una aplicación en Linux o Unix (crear un archivo o escribir directamente los sectores del disco en bruto), ¿Cómo se mueven a un puntero sobre 4G?

Gracias, espera de sus respuestas ...

¿Fue útil?

Solución

El parámetro de desplazamiento de lseek es de tipo off_t. En los entornos de compilación de 32 bits, este tipo por defecto es un entero de 32 bits - sin embargo, si se compila con esta macro definidos antes de que todo sistema incluye:

#define _FILE_OFFSET_BITS 64

... entonces off_t será un tipo con signo de 64 bits.

Para fseek, la función fseeko es idéntico excepto que utiliza el tipo off_t para el desplazamiento, que permite que la solución anterior para trabajar con él también.

Otros consejos

un entero sin signo de 4 bytes puede representar un valor de hasta 4294967295, lo que significa que si usted quiere mover más de 4G, es necesario utilizar lseek64 (). Además, puede utilizar fgetpos () y fsetpos () para cambiar la posición en el archivo.

En Windows, utilice _lseeki64() , en Linux, lseek64() .

Te recomiendo usar lseek64() en ambos sistemas al hacer algo como esto:

#ifdef _WIN32
#include <io.h>
#define lseek64 _lseeki64
#else
#include <unistd.h>
#endif

Eso es todo lo que necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top