Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Manipulación de e/s de archivo grande

Requisitos previos para usar la e/s de 64 bits

admite el uso de operaciones de e/s de archivos de 64 bits en sus programas de archivos MEX.MATLAB® Puede leer y escribir datos en archivos de hasta 2 GB (2 31-1 bytes) de tamaño. Algunos sistemas operativos o compiladores no admiten archivos de más de 2 GB. En los temas siguientes se describe cómo utilizar la e/s de archivos de 64 bits en los ficheros MEX.

Header file

El archivo de cabecera define muchos de los tipos y funciones necesarios para la e/s de archivos de 64 bits. La instrucción para incluir este archivo debe ser la instrucción en el archivo de origen y también debe preceder a cualquier encabezado del sistema incluir instrucciones:io64.hfirst#include

#include "io64.h" #include "mex.h" 

Escriba declaraciones

Para declarar variables utilizadas en e/s de archivos de 64 bits, utilice los siguientes tipos.

MEX tipo

Descripción

Posix

fpos_T

Declara un tipo de 64 bits para y.intsetFilePos()getFilePos() Definido en.io64.h

fpos_t

int64_T, uint64_T

Declara tipos enteros firmados y sin signo de 64 bits. Definido en.tmwtypes.h

,longlong

structStat

Declara una estructura para contener el tamaño de un archivo. Definido en.io64.h

struct stat

FMT64

Se utiliza para especificar la longitud dentro de un especificador de formato como.mexPrintf%d Vea el ejemplo en la sección. se define en.Imprimir mensajes formateadosFMT64tmwtypes.h

%lld

LL, LLU

Sufijos para valores de 64 bits constantes literales (C estándar/IEC 9899:1999 (E) sección 6.4.4.1).intISO® Sólo se utiliza en sistemas.UNIX®

,LLLLU

Funciones

Utilice las siguientes funciones para e/s de archivos de 64 bits. Todos se definen en el archivo de cabecera.io64.h

Función

Descripción

Posix

fileno()

Obtiene un descriptor de archivo de un puntero de archivo

fileno()

fopen()

Abre el archivo y obtiene el puntero de archivo

fopen()

getFileFstat()

Obtiene el tamaño de archivo de un puntero de archivo determinado

fstat()

getFilePos()

Obtiene la posición del archivo para la siguiente e/s

fgetpos()

getFileStat()

Obtiene el tamaño de archivo de un nombre de archivo determinado

stat()

setFilePos()

Establece la posición del archivo para la siguiente e/s

fsetpos()

Especificar valores literales constantes

Para asignar valores literales de enteros de 64 bits firmados y sin firmar, utilice definiciones de tipo y.int64_Tuint64_T

En los sistemas, para asignar un valor literal a una variable entera donde el valor a asignar es mayor queUNIX 2 31-1 firmado, debe sufijos el valor con.LL Si el valor es mayor que 2 32-1 unsigned y, a continuación, utilice como sufijo.LLU Estos sufijos no son válidos en los sistemas.Microsoft®Windows®

Nota

Los sufijos y no son necesarios para los valores codificados de forma rígida (literal) menores queLLLLU 2 G (2 31-1), incluso si están asignadas a un tipo de 64 bits.int

En el ejemplo siguiente se declara una variable de entero de 64 bits inicializada con un valor literal grande y variables de enteros de 2 64 bits:int

void mexFunction(int nlhs, mxArray *plhs[], int nrhs,                    const mxArray *prhs[]) { #if defined(_MSC_VER) || defined(__BORLANDC__)     /* Windows */    int64_T large_offset_example = 9000222000; #else                                              /* UNIX    */    int64_T large_offset_example = 9000222000LL; #endif  int64_T offset   = 0; int64_T position = 0;

Al abrir un archivo

Para abrir un archivo para lectura o escritura, utilice la función C/C++ como lo haría normalmente.fopen Siempre y cuando haya incluido al principio de su programa, funciona correctamente para archivos de gran tamaño.io64.hfopen No se requieren cambios en absoluto para,,,, y.freadfwritefprintffscanffclose

Las siguientes instrucciones abren un archivo existente para leer y actualizar en modo binario.

fp = fopen(filename, "r+b"); if (NULL == fp)    {    /* File does not exist. Create new file for writing      * in binary mode.     */    fp = fopen(filename, "wb");    if (NULL == fp)       {       sprintf(str, "Failed to open/create test file '%s'",         filename);       mexErrMsgIdAndTxt( "MyToolbox:myfnc:fileCreateError",         str);       return;       }    else       {       mexPrintf("New test file '%s' created\n",filename);       }    } else mexPrintf("Existing test file '%s' opened\n",filename);

Imprimir mensajes formateados

No puede imprimir enteros de 64 bits mediante el especificador de conversión.%d En su lugar, use para especificar el formato adecuado para su plataforma. se define en el archivo de cabecera.FMT64FMT64tmwtypes.h En el ejemplo siguiente se muestra cómo imprimir un mensaje que muestra el tamaño de un archivo grande:

int64_T large_offset_example = 9000222000LL;  mexPrintf("Example large file size: %" FMT64 "d bytes.\n",            large_offset_example);

Sustitución y con funciones de 64 bitsfseekftell

el CANSI® y las funciones no son de e/s de archivo de 64 bits capaces en la mayoría de las plataformas.fseekftell Las funciones y, sin embargo, se definen como el correspondiente y (o y) según lo requiera su plataforma/OS.setFilePosgetFilePosPOSIX®fsetposfgetposfsetpos64fgetpos64 Estas funciones son de e/s de archivo de 64 bits capaces en todas las plataformas.

En el ejemplo siguiente se muestra cómo usar en lugar de, y en lugar de.setFilePosfseekgetFilePosftell El ejemplo se utiliza para encontrar el tamaño del archivo.getFileFstat A continuación, se utiliza para buscar al final del archivo para prepararse para agregar datos al final del archivo.setFilePos

Nota

Aunque el parámetro y es realmente un puntero a un entero de 64 bits firmado, se debe convertir a un.offsetsetFilePosgetFilePosint64_Tfpos_T* El tipo se define como el apropiado o, según lo requiera el sistema operativo de la plataforma.fpos_Tio64.hfpos64_tfpos_t

getFileFstat(fileno(fp), &statbuf); fileSize = statbuf.st_size; offset = fileSize;  setFilePos(fp, (fpos_T*) &offset); getFilePos(fp, (fpos_T*) &position );

A diferencia de, sólo admite la búsqueda absoluta relativa al principio del archivo.fseeksetFilePos Si desea realizar una búsqueda relativa, primero llame para obtener el tamaño del archivo.getFileFstat A continuación, convierta el desfase relativo en un desfase absoluto al que pueda pasar.setFilePos

Determinar el tamaño de un archivo abierto

Para obtener el tamaño de un archivo abierto:

  • Actualice el registro del tamaño de archivo almacenado en la memoria mediante y.getFilePossetFilePos

  • Recupere el tamaño del archivo utilizando.getFileFstat

Actualizar el registro de tamaño de archivo

Antes de intentar recuperar el tamaño de un archivo abierto, primero actualice el registro del tamaño del archivo que reside en la memoria. Si omite este paso en un archivo que está abierto para escritura, el tamaño de archivo devuelto puede ser incorrecto o 0.

Para actualizar el registro de tamaño de archivo, busque cualquier desplazamiento en el archivo utilizando.setFilePos Si no desea cambiar la posición del puntero de archivo, puede buscar la posición actual en el archivo. En este ejemplo se obtiene el desplazamiento actual desde el inicio del archivo. A continuación, busca la posición actual para actualizar el tamaño del archivo sin mover el puntero del archivo.

getFilePos( fp, (fpos_T*) &position); setFilePos( fp, (fpos_T*) &position);

Obtener el tamaño del archivo

La función toma un argumento de entrada de descriptor de archivo.getFileFstat Utilice la función para obtener el puntero de archivo del archivo abierto. Devuelve el tamaño de ese archivo en bytes en el campo de una estructura.filenogetFileFstatst_sizestructStat

structStat statbuf; int64_T fileSize = 0;  if (0 == getFileFstat(fileno(fp), &statbuf))    {    fileSize = statbuf.st_size;    mexPrintf("File size is %" FMT64 "d bytes\n", fileSize);    }

Determinar el tamaño de un archivo cerrado

La función toma el nombre de archivo de un archivo cerrado como un argumento de entrada. Devuelve el tamaño del archivo en bytes en el campo de una estructura.getFileStatgetFileStatst_sizestructStat

structStat statbuf; int64_T fileSize = 0;  if (0 == getFileStat(filename, &statbuf))    {    fileSize = statbuf.st_size;    mexPrintf("File size is %" FMT64 "d bytes\n", fileSize);    }