Pregunta

El código actualmente hace esto y fgetpos maneja archivos de más de 4 GB pero la búsqueda devuelve un error, por lo que cualquier idea de cómo buscar hasta el final de un file > 4GB?

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
m_filesize=currentpos;
¿Fue útil?

Solución

Si estás en Windows, quieres GetFileSizeEx (MSDN).El valor de retorno es un int de 64 bits.

En Linux stat64 (página de manual) es correcto.fstat si está trabajando con un ARCHIVO*.

Otros consejos

Ignore todas las respuestas en las que aparezca "64".En Linux, debes agregar -D_FILE_OFFSET_BITS=64 a tus CFLAGS y utiliza el fseeko y ftello funciones que toman/retornan off_t valores en lugar de long.Estos no son parte de C sino POSIX.Otros sistemas POSIX (no Linux) pueden necesitar diferentes opciones para garantizar que off_t es de 64 bits;revisa tu documentación.

Este código me funciona en Linux:

int64_t bigFileSize(const char *path)
{
    struct stat64 S;

    if(-1 == stat64(path, &S))
    {
        printf("Error!\r\n");
        return -1;
    }

    return S.st_size;
}

(robado del manual de glibc)

int fgetpos64 (FILE *stream, fpos64_t *position)

Esta función es similar a fgetpos pero la posición del archivo se devuelve en una variable de tipo fpos64_t a qué posición apunta.

Si las fuentes están compiladas con _FILE_OFFSET_BITS == 64 en una máquina de 32 bits esta función está disponible bajo el nombre fgetpos y reemplaza de manera transparente la antigua interfaz.

Stat siempre es mejor que fseek para determinar el tamaño del archivo; fallará de manera segura en cosas que no sean un archivo.Los tamaños de archivo de 64 bits son algo operativo específico, en gcc puedes poner "64" al final de los comandos, o puedes forzarlo a realizar todas las llamadas estándar 64 de forma predeterminada.Consulte el manual del compilador para obtener más detalles.

En Linux, al menos, podrías usar lseek64 en lugar de fseek.

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