2012-01-03 16 views
5

Necesito pasar algunos valores al método fseek() en C que son mayores que el valor máximo del tipo largo firmado (2147483647). Pero si me gusta más abajo, el valor del resultado es -1, que no es exitoso. ¿Hay alguna forma de que pueda hacer esto?Pasa un valor mayor que el valor máximo de tipo largo a fseek en C

//fp is the pointer to fopen method 
unsigned long long index=2147483648; 
int status = fseek(fp, index, SEEK_SET); 
+0

wow ... ¿qué tipo de archivo masivo loco es este que requiere una búsqueda en algún lugar mucho más que el valor máximo de unsigned de largo? –

+1

@MichaelDautermann Los archivos de 2GB no son nada. He tratado con archivos (únicos) como '6 TB' grandes. – Mysticial

+1

@MichaelDautermann: Estamos en 2012, ¿cómo el archivo de 2 GB es un "archivo masivo loco"? – ybungalobill

Respuesta

9

Dado que etiquetó esto con "Objective-C", asumo que también está pensando en Macintosh.

Check out fseeko (que toma un número de 64 bits).

+0

+1. El beneficio de esto es que el ancho de 'off_t' se procesa en compilación de 32 o 64 bits. –

+1

(Completado con el uso de la opción de compilación '-D_FILE_OFFSET_BITS = 64'.) –

+0

thnx para la solución :) – user1120633

6

Es necesario utilizar la versión de 64 bits de fseek():

  • de Windows: _fseeki64()
  • Linux: fseeko() con #define _FILE_OFFSET_BITS 64 o -D_FILE_OFFSET_BITS=64

Y para lseek():

  • de Windows: _lseeki64()
  • Linux: lseek() con #define _FILE_OFFSET_BITS 64 o -D_FILE_OFFSET_BITS=64

También hay lseek64(), pero como se mencionó por @R .. (ver comentarios), no debe ser utilizado.

+2

'lseek64' es la versión de 64 bits de' lseek', no 'fseek', pero quizás lo más importante es que nunca debe usarse. En su lugar compila ** todo ** con '-D_FILE_OFFSET_BITS = 64' (esto ni siquiera debería ser una opción, debe ser por defecto y debes ponerlo en todos los makefiles de tu proyecto) y usa la función estándar' fseeko'. –

+0

Ah sí, tienes razón, dame un minuto. para hacer eso correcto. Mencionaré tanto 'lseek' como' fseek'. – Mysticial

+0

@R. Cambios realizados. Avíseme si hay algo más que deba solucionar. – Mysticial

Cuestiones relacionadas