Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fopen y fclose
Estas funciones sirven para abrir y cerrar archivos, respectivamente.
La función fopen tiene la forma:
[ fi, texto ] = fopen( nom_archivo, c)
donde fi es una variable que recibe el valor de retorno que identifica
A continuación veremos funciones para lectura y escritura de archivos.
Prof. Saúl. Buitrago y Oswaldo Jiménez
donde fi es una variable que recibe el valor de retorno que identifica al archivo de nombre nom_archivo, texto es un mensaje para el caso de que se produzca un error, y c es un carácter (o dos) que indica el tipo de operación que se desea realizar con el archivo. Las opciones más importantes para c son las siguientes:
'r' lectura (de read)
'w' escritura reemplazando (de write)
'a' escritura a continuación (de append)
'r+' lectura y escritura
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fopen y fclose (cont.)
Cuando por alguna razón el archivo no puede ser abierto, se devuelve un -1 en la variable fi . En este caso el valor de retorno texto puede proporcionar información sobre el tipo de error que se ha producido.
Después de realizar las operaciones de lectura y escritura deseadas,
Prof. Saúl. Buitrago y Oswaldo Jiménez
el archivo se puede cerrar con la función fclose en la forma siguiente:st = fclose( fi )
donde st es un valor de retorno para posibles condiciones de error,(cuando st retorna como 0 significa que el archivo cerró bien).Si se quieren cerrar a la vez todos los archivos abiertos puede utilizarse el comando:
st = fclose( 'all' )
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf
Estas funciones permiten leer y escribir en archivos ascii, es decir, en archivos de texto plano.Forma general de la función fscanf:
[ var, count ] = fscanf( fi, format, size )Lee del archivo identificado por fi de acuerdo a un formato especificado por format y lo devuelve en la variable var (real, vector o matriz).
Prof. Saúl. Buitrago y Oswaldo Jiménez
N lee a lo más N elementos en un vector columnainf lee hasta el final del archivo[M,N] lee a lo más M * N elementos llenando al menos una matriz M×N siguiendo el orden de columnas. N puede ser inf, pero no M.
count (opcional) devuelve el número de elementos leídos satisfactoriamente. size (opcional) limita el número de elementos a ser leidos en el archivo Si no se coloca, lee hasta el final del archivo. Si se especifica, se tienen las siguientes opciones
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
format va encerrada entre comillas simples, y contiene los especificadores de formato para las variables
%s para cadenas de caracteres%d para variables enteras%f para variables de punto flotante%c para un caracter
Prof. Saúl. Buitrago y Oswaldo Jiménez
Ejemplos :
Considérese el archivo de texto plano de nombre entrada1.txt, mostrado en la figura.
Veamos varias posibilidades de lectura sobre este archivo:
1) >> fi1 = fopen('entrada1.txt', 'r');>> s = fscanf( fi1, '%s');>> fclose(fi1);
Lee todo el contenido del archivo como una cadena de caracteres, quitando los espacios en blanco. El resultado ess = '1001200324512aab678910201'
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
2) >> fi2 = fopen('entrada1.txt', 'r');>> s = fscanf( fi2, '%d');>> fclose(fi2);
Lee enteros mientras sea posible. Por ejemplo, cuando se consigue la cadena 'aab', la misma no puede ser leída como un entero, de modo que el último entero leído es 512. Nótese que el arreglo resultante es
Prof. Saúl. Buitrago y Oswaldo Jiménez
que el último entero leído es 512. Nótese que el arreglo resultante es columna, esto es:
s = [ 1001200324
512 ]
3) >> fi3 = fopen('entrada1.txt', 'r');>> s = fscanf( fi3, '%d',1);>> fclose(fi3);
Lee sólo un entero. Así, s = 1001
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
La lectura mediante fscanf es secuencial sobre los archivos de texto plano, de manera que es posible leer todos los datos contenidos en éste, si se conoce previamente la estructura del archivo. Por ejemplo:
4) >> fi4 = fopen('entrada1.txt', 'r');
Prof. Saúl. Buitrago y Oswaldo Jiménez
4) >> fi4 = fopen('entrada1.txt', 'r');>> s = fscanf( fi4, '%d',5);>> t = fscanf( fi4, '%s',1);>> u = fscanf( fi4, '%d');>> fclose(fi4);
Lee los primeros cinco enteros, los cuales son almacenados en el vector columna
s = [ 1001 ; 200 ; 32 ; 4 ; 512 ]
Lee una cadena de caracteres que queda almacenada en la variable t, por lo cual
t = 'aab'
Lee los enteros que están después de la cadena 'aab' hasta el final del archivo. El resultado es el vector columna
u = [ 6 ; 7 ; 8 ; 9 ; 10201 ]
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Supongamos ahora que se quieren leer varias matrices desde un archivo de texto plano de nombre "matrices.txt" a fin de mostrarlas en pantalla. En el mismo archivo está contenida la información de cuántas matrices se van a leer y, para cada una de ellas, se especifica nombre, dimensiones y los elementos que la componen. A continuación se muestra un ejemplo de un tal archivo:
Prof. Saúl. Buitrago y Oswaldo Jiménez
de un tal archivo:
cantidad de matrices a ser leídas
dimensiones de las matrices
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
En el siguiente código, se lee la información contenida en el archivo "matrices.txt" y se muestran en la pantalla las matrices leídas.
% Se abre el archivo 'matrices.txt' para lecturafid = fopen('matrices.txt','r');
% Se verifica si el archivo se abrió correctamenteif fid == -1
disp('No se pudo abrir el archivo matrices.txt');return
Prof. Saúl. Buitrago y Oswaldo Jiménez
returnend
nmat = fscanf(fid,'%d',1); % Cantidad de matrices a ser leídas
for k = 1 : nmat % para cada matriz se lee ...nombre_matriz = fscanf(fid,'%s',1); % ... nombrenfil = fscanf(fid,'%d',1); % ... cantidad de filasncol = fscanf(fid,'%d',1); % ... cantidad de columnasmatriz = fscanf(fid,'%d',[ncol,nfil]); % ... elementosmatriz = matriz';% Se imprime la matriz por pantalladisp(matriz);
endfclose(fid);
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Es importante destacar la forma en la que se lee cada matriz:
* Para leer la matriz completa, se especifica, como tercer parámetro
de la función fscanf, al vector [ncol,nfil]; esto es, la matriz se lee
por filas.
matriz = fscanf(fid,'%d',[ncol,nfil]);
Prof. Saúl. Buitrago y Oswaldo Jiménez
matriz = fscanf(fid,'%d',[ncol,nfil]);
* Como cada fila leída se almacena por columnas, la matriz
resultante de la lectura es, en realidad, la traspuesta de la matriz
dada en el archivo. Por lo tanto, es necesario trasponer la matriz
resultante de la lectura.
matriz = matriz';
Siempre se deben ejecutar estos dos pasos para leer una matriz Siempre se deben ejecutar estos dos pasos para leer una matriz completa desde un archivo de texto plano.completa desde un archivo de texto plano.
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Existe una alternativa para leer una matriz desde un archivo de texto
plano, aunque es menos eficiente que la lectura de la matriz completa
mediante el procedimiento explicado en la lámina anterior. Consiste en
leer la matriz fila por fila en un cicloleer la matriz fila por fila en un ciclo. Así, la lectura de las matrices
contenidas en el archivo "matrices.txt" dado anteriormente, se vería
Prof. Saúl. Buitrago y Oswaldo Jiménez
contenidas en el archivo "matrices.txt" dado anteriormente, se vería
como se muestran en el siguiente código:
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Funciones fscanf y fprintf (cont.)% Se abre el archivo 'matrices.txt' para lecturafid = fopen('matrices.txt','r');
% Se verifica si el archivo se abrió correctamenteif fid == -1
disp('No se pudo abrir el archivo matrices.txt');return
end
nmat = fscanf(fid,'%d',1); % Cantidad de matrices a ser leídas
Prof. Saúl. Buitrago y Oswaldo Jiménez
nmat = fscanf(fid,'%d',1); % Cantidad de matrices a ser leídas
for k = 1 : nmat % para cada matriz se lee ...nombre_matriz = fscanf(fid,'%s',1); % ... nombrenfil = fscanf(fid,'%d',1); % ... cantidad de filasncol = fscanf(fid,'%d',1); % ... cantidad de columnasmatriz = [ ]; % 'sine qua non'for i = 1 : nfil
matriz(i,:) = fscanf(fid,'%d',ncol);end% Se imprime la matriz por pantalladisp(matriz);
endfclose(fid);
Para que esta técnica funcione, es imperativo inicializar la variable 'matriz''matriz' cada vez que se vaya a leer una nueva matriz desde el archivo. Esto se debe básicamente al hecho de que se está usando una misma variable para almacenar todas las matrices leídas.
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Funciones fscanf y fprintf (cont.)
Todavía se puede escribir una tercera versión de este programa, considerando el hecho de que el tamaño de la matriz consiste de dos números enteros (número de filas y de columnas) que pueden ser leídos simultáneamente :
% Se abre el archivo 'matrices.txt' para lecturafid = fopen('matrices.txt','r');
...
for k = 1 : nmat
Prof. Saúl. Buitrago y Oswaldo Jiménez
fid = fopen('matrices.txt','r');
% Se verifica si el archivo se abrió correctamenteif fid == -1
disp('No se pudo abrir el archivo matrices.txt');return
end
nmat = fscanf(fid,'%d',1); % Cantidad de matrices% a ser leídas
...
for k = 1 : nmatnombre_matriz = fscanf(fid,'%s',1); tam = fscanf(fid,'%d',2);nfil = tam(1); ncol = tam(2);matriz = [ ];for i = 1 : nfil
matriz(i,:) = fscanf(fid,'%d',ncol);end% Se imprime la matriz por pantalladisp(matriz);
endfclose(fid);
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Forma general de la función fprintf:count = fprintf( fi, format, var, … )
Dirige su salida formateada hacia el archivo indicado por el identificador fi , format contiene los formatos de escritura y count retorna el número de bytes escritos satisfactoriamente. Después del formato habrá una lista de variables y/o valores que deben concordar, una a una, en cantidad y
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> fi1 = fopen(‘salida1’, ‘w’);>> count = fprintf( fi1, ‘el número de ecuaciones es %d \n’, n);
→ escribe el texto entre comillas y el valor de la variable n según el formato indicado (número entero en este caso)
>> fi2 = fopen(‘salida2’, ‘w’);>> count = fprintf( fi2, ‘el determinante es %10.4f \n’, n);
en tipo con los especificadores de conversión que aparezcan en el formato, los cuales se identifican por el uso del caracter %.
Ejemplos :
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Obs . El uso de \n para saltar líneas en un archivo de texto plano, no se ve reflejado al abrir el archivo con la aplicación bloc de notas (notepad) de Windows. Es decir, al abrir el archivo, la impresión visual es que no hay saltos de línea en absoluto. Esto se resuelve usando la secuencia \r\n en el formato para fprintf, en lugar de usar sólo \n.
Obs . \n en el formato obliga a crear una línea nueva en el archivo de texto.
Prof. Saúl. Buitrago y Oswaldo Jiménez
sólo \n.
Obs . Aunque se podría creer que \n es una cadena de dos caracteres cuando aparece en un formato de impresión, en realidad es uncaracter especial no imprimible que sgnifica "nueva línea" (new line). De la misma manera, \r es un caracter especial no imprimible que significa "salto de línea" (carriage return) cuando aparece en un formato de impresión. De hecho, los códigos ascii de estos caracteres especiales son 10 para \n y 13 para \r. Por lo tanto, una expresión como fprintf(fid,'\r\n'); es totalmente equivalente a esta otra fprintf(fid,'%c%c',char(13),char(10)); Haga el ejercicio de verificarlo.
Instrucciones de entrada (lectura) y de salida (escritura) (cont.)
Estructuras de control
Funciones fscanf y fprintf (cont.)
Obs . A los caracteres especiales no imprimibles, tales como \r y \n, también se les conoce como caracteres de "escape" (escape characters). Otros caracteres de escape no imprimibles son
\b (backspace, código ascii 8), \t (horizontal tab, código ascii 9),\f (form feed, código ascii 12).
Existen caracteres de escape imprimibles, básicamente destinados a incluir en la impresión aquellos caracteres que tienen significado
Prof. Saúl. Buitrago y Oswaldo Jiménez
Obs . La función fprintf de Matlab se puede usar para imprimir mensajes en la pantalla del computador. Para ello, basta omitir el parámetro referido al número de identificación de archivo (primer parámetro). Los demás parámetros, esto es, el formato y la lista eventual de variables y/o valores asociados a los especificadores de conversión, se manejan de la misma manera que en el caso de impresión en archivos.
incluir en la impresión aquellos caracteres que tienen significado especial dentro del formato. Por ejemplo, para imprimir la comilla simple en un formato, se debe usar '' (i.e. dos veces la comilla simple); asimismo, %% permite imprimir el caracter % en un formato. Consulte la ayuda de fprintf para obtener más información.
Leer un conjunto de matrices de un archivo, determinar cuales son DD y cuales no, y las escribe en un archivo con el resultado.Archivo de entrada: datos_matrices_DD.txtArchivo de salida: salida_matrices_DD.txtScript: lectura_matrices_DD.m
Estructuras de control
Ejemplo :
Definición :Una matriz A de orden n×n es diagonal dominante estricta si
n
Prof. Saúl. Buitrago y Oswaldo Jiménez
niaan
ijj
ijii ≤≤> ∑≠=
1,,1
La matriz
506
135
027
+>−
−+>
+>
−−=650
153
027
A es diagonal dominante estricta, ya que
Estructuras de control
Ejemplo :
Archivo de entrada:
datos_matrices_DD.txt
número de matrices dimensiones
de las matrices
Prof. Saúl. Buitrago y Oswaldo Jiménez
Estructuras de controlEjemplo :
Nótese la traspuesta
Impresión en pantalla
Prof. Saúl. Buitrago y Oswaldo Jiménez
Nótese la traspuesta
Saltos de línea para Notepad
Cadena de caracteres y archivos
Estructuras de datos
Ejercicio : Dada una cadena de caracteres, la cual representa a un número hexadecimal (es decir, en base 16), hallar el correspondiente valor en base 10. Se plantea que los números hexadecimales a ser convertidos a base 10 se lean desde un archivo de texto plano, de modo que cada número esté en una línea del archivo . En este caso es estrictamente necesario manejar el dato de entrada como una cadena de caracteres porque en base 16 se utilizan dígitos representados por letras (los dígitos en base 16 son 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
Prof. Saúl. Buitrago y Oswaldo Jiménez
representados por letras (los dígitos en base 16 son 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).
Se propone crear un script en Matlab que lleve a cabo esta tarea. Se espera que el programa verifique exhaustivamente la pertinencia de los datos que sean leídos desde el archivo de texto plano.El manejo de los códigos ascii previsto en Matlab facilita enormemente la resolución de este problema. Se les sugiere resolver primero el problema desde el punto de vista lógico, escribiendo (en el papel) un algoritmo en lenguaje natural, que luego trasladarán al lenguaje de Matlab.
archivo : hexadecimal_a_decimal.m
Instrucción de lectura “textread”
Estructuras de control
Lee datos numéricos (sin formato) o heterogéneos (con formato) de un archivo de texto (ascii)
Sintaxis sin usar formato:
a = textread(archivo)
a = textread(archivo, ‘ ', n)
a = textread(archivo, ‘ ', param, valor, ...)
a = textread(archivo, ‘ ', n, param, valor, ...)
Prof. Saúl. Buitrago y Oswaldo Jiménez
a = textread(archivo, ‘ ', n, param, valor, ...)
Lee n líneas de archivo y las almacena en la variable a. Se supone que archivo contiene sólo datos numéricos.
Opciones para param
• 'delimiter': identifica el caracter de separación entre los datos
• 'headerlines': número de líneas de cabecera del archivo, estas líneas son ignoradas en la lectura
• 'commentstyle‘: con valor 'matlab‘, indica que los caracteres después de % son ignorados
Estructuras de control
>> a = textread('datos2.csv ', ' ', 'delimiter', ',')
Ejemplos:
>> a = textread('datos1.txt ')
→ lee todas las líneas del archivo
>> a = textread('datos1.txt ', ' ', 1)
→ lee la primera línea del archivo
Instrucción de lectura “textread” (cont.)
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> a = textread('datos2.csv ', ' ', 'delimiter', ',')
→ lee todas las líneas del archivo
>> a = textread('datos2.csv', ' ', 1, 'delimiter', ',')
→ lee la primera línea del archivo
>> a = textread('datos22.csv', ' ', 'delimiter', ',', 'headerlines', 1)
→ lee todas las líneas del archivo después del encabezado
>> a = textread('datos23.csv', ' ', 'delimiter', ',', 'headerlines', 1, 'commentstyle', 'matlab') → lee todas las líneas del archivo después del encabezado, ignorando las comentadas
Estructuras de control
Sintaxis usando formato:
[a, b, c, …] = textread(archivo, formato)
[a, b, c, …] = textread(archivo, formato, n)
[a, b, c, …] = textread(archivo, formato, param, valor, ...)
[a, b, c, …] = textread(archivo, formato, n, param, valor, ...)
Lee n líneas de archivo con formato especificado y las almacena en las variables a, b, c, etc., respectivamente. Los datos en archivo
Instrucción de lectura “textread” (cont.)
Prof. Saúl. Buitrago y Oswaldo Jiménez
las variables a, b, c, etc., respectivamente. Los datos en archivopueden ser heterogéneos (números y caracteres), pero se espera que estén organizados homogéneamente por columnas.
• El tipo de dato de cada columna se suministra en formato y corresponde a cada variable a, b, c, …
• Si n no se especifica o si es -1, lee el archivo completo, en caso contrario lee n líneas
Formatos:
%n : números reales o enteros
%d : números enteros
%f : números reales
%s : cadena de caracteres
%5c : 5 caracteres (incluye espacios en blanco)
Estructuras de control
Ejemplos:
>> [nombre, tipo, x, y, respuesta] = …
textread('datos.txt', '%s %s %f %d %s')
nombre = 'Sally''Joe''Bill'
tipo = 'Type1''Type2''Type1'
x =12.340023.540034.9000
y =45
→ lee todas las líneas del archivo, según el formato especificado y las almacena en las variables indicadas
Instrucción de lectura “textread” (cont.)
Prof. Saúl. Buitrago y Oswaldo Jiménez
456012
respuesta = 'Si''No''No'
>> nombre = textread('datos.txt', '%s %*[^\n]')
→ lee la primera columna
nombre = 'Sally''Joe''Bill'
Instrucciones de lectura “textread” (cont.)
Estructuras de control
>> inicial = textread('datos.txt', '%c %*[^\n]')
→ lee el primer caracter inicial = SJB
>> x = textread('datos.txt', '%*s %*s %f %*d %*s')
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> a = textread('datos.txt', '%s', 'delimiter', '\n') → cada línea como cadena de caracteres
→ lee la tercera columna x =12.340023.540034.9000
a = 'Sally Type1 12.34 45 Si''Joe Type2 23.54 60 No''Bill Type1 34.90 12 No'
Estructuras de datos
Arreglos de cadenas de caracteres
Un arreglo de cadena de caracteres es como un vector cuyos elementos son cadenas de caracteres. Este puede ser creado usando llaves, así
>> s1 = {‘hola’ ‘si’ ‘adios’} →>> ss = {'saul' 'pedro' ; 'pepe' 'maria'}
→
Si construimos la cadena de caracteres concatenados verticalmente
ss ='saul' 'pedro‘'pepe' 'maria'
s1 = 'hola' 'si' 'adios'
Prof. Saúl. Buitrago y Oswaldo Jiménez
Se tiene que s1 y s2 son diferentes, pero se puede pasar de un tipo al otro usando las funciones “char” y “cellstr”.
Además existen las funciones “ischar” y “iscellstr” para identificar entre cada uno de ellos.
Si construimos la cadena de caracteres concatenados verticalmente
>> s2 = strvcat(‘hola', 'si', ‘adios')
La podemos interpretar como “arreglo de cadena de caracteres”, pero no es tal.
Instrucciones de lectura “textread” (cont.)
Estructuras de control
>> nombre
nombre = 'Sally''Joe''Bill'
Dado el arreglo de cadena de caracteres nombre:
Podemos agregar una cadena de caracteres a este arreglo:
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> nombre = cellstr(strvcat(char(nombre),‘Pedro'))→ agrega al arreglo de cadena de caracteres ‘nombre’ el elemento ‘Pedro’
nombre = 'Sally''Joe''Bill'‘Pedro'
>> size(nombre) → ans = 4 1
Instrucción de lectura “load”
Estructuras de control
Lee el contenido de un “archivo” y lo deposita en un arreglo con nombre “archivo”.
>> load datos1.txt
→ almacena el contenido en la variable datos1
la instrucción es equivalente a load –ascii datos1.txt
>> s = load(‘datos1.txt’)
→ almacena el contenido en la variable s
Prof. Saúl. Buitrago y Oswaldo Jiménez
→ almacena el contenido en la variable s
>> var = ‘datos1.txt’; s = load(var) → almacena en la variable s
Obs:• El archivo puede tener cualquier extensión diferente a “.mat”, el
archivo es tratado como ascii• Es importante que todas las filas tengan el mismo número de
columnas• Las separaciones entre elementos: blancos o comas (,)• El archivo debe tener sólo números