Pregunta

lseek() se supone que devuelve la posición del descriptor del archivo.

los documentación dice:

Al finalizar con éxito, Lseek () devuelve la ubicación de compensación resultante medida en bytes desde el comienzo del archivo. De lo contrario, se devuelve un valor de -1 y ERRNO se establece para indicar el error.

El problema es que ni siquiera esto funciona:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
printf("size off_t: %i\n", sizeof(off_t));

off_t pos;
pos = lseek(file, (off_t)0, SEEK_CUR);
printf("pos: %lli\n", pos);

// same result for SEEK_SET and SEEK_END
pos = lseek(file, (off_t)2352, SEEK_CUR);
printf("pos: %lli\n", pos);

Esto me da:

size off_t: 8
pos: 0
pos: 0

¿Por qué es esto? ¿Existe una alternativa para encontrar el desplazamiento actual, utilizando las funciones de E/S sin procesar? (read, open, lseek, …)

Editar 1:

Traté de simplificar el ejemplo.

¿Fue útil?

Solución

Intenta agregar #includeu003Cunistd.h> a la cima.

Ver: http://forums.macosxhints.com/archive/index.php/t-35508.html

Básicamente, ya que no lo hiciste #include <unistd.h>, el compilador está "adivinando" que lseek() Devuelve un int.

Probablemente un INT tiene 4 bytes de largo, y dado que PPC es un orden de bytes "grande", está obteniendo los 4 bytes "superiores", que son cero.

Incluir unistd.h deja que el compilador se dé cuenta de que lseek() está devolviendo un off_t, así que no pierdes la mitad de los bytes.

Otros consejos

Algo más está pasando, probablemente algo tonto. Probé tu código, como aquí:

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    off_t pos;
    int file ;
    if((file = open("/Users/chasrmartin/.bash_history",O_RDONLY)) == -1){
        perror(argv[0]);
        exit(1);
    }
    printf("size off_t: %i\n", sizeof(off_t));

    pos = lseek(file, (off_t)0, SEEK_CUR);
    printf("pos: %lli\n", pos);

    // same result for SEEK_SET and SEEK_END
    pos = lseek(file, (off_t)2352, SEEK_CUR);
    printf("pos: %lli\n", pos);

    exit(0);
}

Y obtenga este resultado:

bash $ gcc foo.c
bash $ ./a.out
size off_t: 8
pos: 0
pos: 2352

(Solo para ser definido, esto está en Mac OS/X 10.5.6 en Intel).

Actualizar.

O tal vez no es tonto. Solo lo probé en un PPC G5 y obtuve los resultados que hace.

Actualización 2

Bien, aquí está el resultado en un PPC:

$ gcc foo.c
$ ./a.out
size off_t: 8
pos: 0
pos: 0

¿Qué tipo de archivo es? ¿Es una tubería por casualidad? Porque si se trata de un archivo regular, es probable que no sea compatible con la búsqueda:

El comportamiento de lseek () en dispositivos que son incapaces de buscar es definido por la implementación. El valor del desplazamiento del archivo asociado con dicho dispositivo no está definido.

No estoy seguro de entender tu pregunta, pero aquí hay algunos pensamientos que podrían ayudar.

  • El compensación 0 es válido; significa que está al comienzo del archivo
  • Dependiendo de su plataforma, Off_t puede limitarse a 32 bits sin firmar.
  • ¿Tiene la intención de buscar en relación con su posición actual?

- Markusq

Es posible que desee cambiar la prueba a:

if ( (pos = lseek(file, (off_t)i, SEEK_CUR)) != -1 ) {

Probablemente esté llegando a un -1 en algún lugar, pero está probando 0 aquí.

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