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.

Importar datos binarios con e/s de bajo nivel

Funciones de bajo nivel para importar datos

Funciones de e/s de archivos de bajo nivel permite el control más directo sobre la lectura o la escritura de datos en un archivo. Sin embargo, estas funciones requieren que especifique información más detallada sobre su archivo que la funciones de alto nivelmás fácil de usar. Para obtener una lista completa de las funciones de alto nivel y los formatos de archivo que admiten, consulte Formatos de archivo admitidos para importación y exportación.

Si las funciones de alto nivel no pueden importar sus datos, utilice uno de los siguientes procedimientos:

Nota

Las funciones de e/s de archivos de bajo nivel se basan en funciones de la biblioteca estándar C de ANSI® . Sin embargo, MATLAB® incluye versiones vectorizada de las funciones, para leer y escribir datos en una matriz con bucles de control mínimos.

Lectura de datos binarios en un archivo

Al igual que con cualquiera de las funciones de e/s de bajo nivel, antes de importar, abra el archivo con fopeny obtenga un identificador de archivo. Cuando termine de procesar un archivo, cierrelo con fclose(fileID).

De forma predeterminada, fread Lee un archivo de 1 byte a la vez e interpreta cada byte como un entero de 8 bits que no tiene signo (uint8). fread crea un vector de columna, con un elemento para cada byte del archivo. Los valores del vector de columna son de la clase double.

Por ejemplo, considere el archivo nine.bin, creado de la siguiente manera:

fid = fopen('nine.bin','w'); fwrite(fid, [1:9]); fclose(fid);

Para leer todos los datos del archivo en un vector de columna de 9 por 1 de la clase double:

fid = fopen('nine.bin'); col9 = fread(fid); fclose(fid);

Cambiar las dimensiones de la matriz

De forma predeterminada, fread Lee todos los valores del archivo en un vector de columna. Sin embargo, puede especificar el número de valores que se leerán o describir una matriz de salida de dos dimensiones.

Por ejemplo, para leer nine.bin, descrito en el ejemplo anterior:

fid = fopen('nine.bin');  % Read only the first six values col6 = fread(fid, 6);  % Return to the beginning of the file frewind(fid);  % Read first four values into a 2-by-2 matrix frewind(fid); two_dim4 = fread(fid, [2, 2]);  % Read into a matrix with 3 rows and % unspecified number of columns frewind(fid); two_dim9 = fread(fid, [3, inf]);  % Close the file fclose(fid);

Descripción de los valores de entrada

Si los valores de su archivo no son enteros de 8 bits sin signo, especifique el tamaño de los valores.

Por ejemplo, considere el archivo fpoint.bin, creado con valores de doble precisión de la siguiente manera:

myvals = [pi, 42, 1/3];  fid = fopen('fpoint.bin','w'); fwrite(fid, myvals, 'double'); fclose(fid);

Para leer el archivo:

fid = fopen('fpoint.bin');  % read, and transpose so samevals = myvals samevals = fread(fid, 'double')';  fclose(fid);

Para obtener una lista completa de las descripciones de precisión, consulte la página de referencia de la función fread .

Memoria de ahorro

De forma predeterminada, fread crea una matriz de clase double. Almacenar valores de doble precisión en una matriz requiere más memoria que almacenar caracteres, enteros o valores de precisión única.

Para reducir la cantidad de memoria requerida para almacenar los datos, especifique la clase de la matriz utilizando uno de los métodos siguientes:

  • Empareje la clase de los valores de entrada con un asterisco ('*'). Por ejemplo, para leer valores de precisión única en una matriz de clase single, utilice el comando:

    mydata = fread(fid,'*single')
  • Asignar los valores de entrada a una nueva clase con el símbolo '=>' . Por ejemplo, para leer los valores de uint8 en una matriz uint16 , utilice el comando:

    mydata = fread(fid,'uint8=>uint16')

Para obtener una lista completa de las descripciones de precisión, consulte la página de referencia de la función fread .

Lectura de partes de un archivo

las funciones de bajo nivel de MATLAB incluyen varias opciones para leer porciones de datos binarios en un archivo:

Prueba de fin de archivo

Al abrir un archivo, MATLAB crea un puntero para indicar la posición actual dentro del archivo.

Nota

Al abrir un archivo vacío, no mueve el indicador de posición del archivo al final del archivo. Lea las operaciones, y las funciones fseek y frewind , mueva el indicador de posición del archivo.

Utilice la función feof para comprobar si ha alcanzado el final de un archivo. feof devuelve un valor de 1 cuando el puntero del archivo se encuentra al final del archivo. De lo contrario, devuelve 0.

Por ejemplo, lea un archivo grande en partes:

filename = 'largedata.dat';  % hypothetical file segsize = 10000;  fid = fopen(filename);  while ~feof(fid)     currData = fread(fid, segsize);     if ~isempty(currData)         disp('Current Data:');         disp(currData);     end end      fclose(fid);

Mover dentro de un archivo

Para leer o escribir partes seleccionadas de datos, mueva el indicador de posición de archivo a cualquier ubicación del archivo. Por ejemplo, llame a fseek con la sintaxis

fseek(fid,offset,origin);

donde:

  • fid es el identificador de archivo Obtenido de fopen.

  • offset es un valor de desvío positivo o negativo, especificado en bytes.

  • origin especifica la ubicación desde la que se calcula la posición:

    'bof'

    Inicio del archivo

    'cof'

    Posición actual en el archivo

    'eof'

    Fin del archivo

Alternativamente, para moverse fácilmente al principio de un archivo:

frewind(fid);

Utilice ftell para encontrar la posición actual dentro de un archivo determinado. ftell devuelve el número de bytes desde el principio del archivo.

Por ejemplo, cree un archivo five.bin:

A = 1:5; fid = fopen('five.bin','w'); fwrite(fid, A,'short'); fclose(fid);

Dado que la llamada a fwrite especifica el formato short , cada elemento de A utiliza dos bytes de almacenamiento de información en five.bin.

Reabrir five.bin para la lectura:

fid = fopen('five.bin','r');

Mueva el indicador de posición de archivo hacia adelante 6 bytes desde el principio del archivo:

status = fseek(fid,6,'bof'); 

Lea el siguiente elemento:

four = fread(fid,1,'short');

El acto de lectura avanza el indicador de posición del archivo. Para determinar el indicador de posición del archivo actual, llame a ftell:

position = ftell(fid)  position =       8 

Para mover el indicador de posición de archivo hacia atrás 4 bytes, vuelva a llamar a fseek :

status = fseek(fid,-4,'cof');

Lea el siguiente valor:

three = fread(fid,1,'short');

Lectura de archivos creados en otros sistemas

Los diferentes sistemas operativos almacenan información diferente en el nivel de byte o bit:

  • los sistemas Big-Endian almacenan bytes comenzando por la dirección más grande de la memoria (esto es, empiezan con el extremo grande).

  • los sistemas Little-endian almacenan bytes comenzando con la dirección más pequeña (el extremo pequeño).

los sistemas Windows® utilizan el ordenamiento de bytes Little-endian y los sistemas UNIX® utilizan el orden de bytes big-endian.

Para leer un archivo creado en un sistema opuesto a endian, especifique el orden de bytes utilizado para crear el archivo. Puede especificar el orden en la llamada para abrir el archivo o en la llamada para leer el archivo.

Por ejemplo, considere un archivo con valores de doble precisión denominado little.bin, creado en un sistema Little-Endian. Para leer este archivo en un sistema big-endian, utilice uno (o ambos) de los siguientes comandos:

  • Abra el archivo con

    fid = fopen('little.bin', 'r', 'l')
  • Lea el archivo con

    mydata = fread(fid, 'double', 'l')

donde 'l' indica un pedido poco-endian.

Si no está seguro del byte que ordena el uso del sistema, llame a la función computer :

[cinfo, maxsize, ordering] = computer
El devuelto ordering es 'L' para sistemas Little-endian, o 'B' para sistemas big-endian.

Abrir archivos con diferentes codificaciones de caracteres

Esquemas de codificación apoyan los caracteres requeridos para los alfabetos particulares, tales como ésos para las idiomas japonesas o europeas. Los esquemas comunes de la codificación incluyen US-ASCII o UTF-8.

El esquema de codificación determina el número de bytes requeridos para leer o escribir valores char . Por ejemplo, los caracteres US-ASCII siempre usan 1 byte, pero los caracteres UTF-8 usan hasta 4 bytes. MATLAB procesa automáticamente el número requerido de bytes para cada valor char basándose en el esquema de codificación especificado. Sin embargo, si especifica una precisión uchar , MATLAB procesa cada byte como uint8, independientemente de la codificación especificada.

Si no especifica un esquema de codificación, fopen abre los archivos para su procesamiento mediante la codificación predeterminada del sistema. Para determinar el valor predeterminado, abra un archivo y vuelva a llamar a fopen con la sintaxis:

[filename, permission, machineformat, encoding] = fopen(fid);

Si especifica un esquema de codificación al abrir un archivo, las siguientes funciones aplican ese esquema: fscanf, fprintf, fgetl, fgets, fready fwrite.

Para obtener una lista completa de los esquemas de codificación admitidos y la sintaxis para especificar la codificación, consulte la página de referencia de fopen .