Está en la página 1de 42

TEMA 6 SEGUNDA

PARTE

PROGRAMACIÓN avanzada
FICHEROS DE DATOS: acceso a disco

Sagrario Lantarón. 2021


FICHEROS DE DATOS (pag. 116)

FICHEROS DE DATOS. ACCESO A DISCO

¿QUÉ SON LOS FICHEROS?

Son archivos existentes o que se van a crear en disco(archivos en


disco duro, pendrive, disco externo, ….)
FICHEROS DE DATOS (pag. 116)

FICHEROS DE DATOS. ACCESO A DISCO

¿CÓMO LOS USAREMOS DESDE NUESTROS PROGRAMAS?

Tendremos que conectar nuestros programas


Matlab/Octave ( archivos .m) con los ficheros en disco
FICHEROS DE DATOS (pag. 116)

FICHEROS DE DATOS. ACCESO A DISCO

¿POR QUÉ USAR FICHEROS?

En lectura:
Si hay que suministrar gran cantidad de datos al programa
FICHEROS DE DATOS (pag. 116)

FICHEROS DE DATOS. ACCESO A DISCO

¿POR QUÉ USAR FICHEROS?

En escritura de datos:

Para no perder los datos escritos en pantalla al apagar el ordenador,

Archivos que generará el programa y guardará en disco con la


respuesta de la ejecución
FICHEROS DE DATOS
OPERACIONES A REALIZAR CON FICHEROS

1º) Apertura del fichero


Utilizamos la función FOPEN (pag. 116)

OBLIGATORIO ANTES DE USAR EL FICHERO

Realiza la conexión entre nuestro archivo .m y el fichero externo


FICHEROS DE DATOS
OPERACIONES A REALIZAR CON FICHEROS
OBLIGATORIO ANTES DE
1º) Apertura del fichero USAR EL FICHERO
Utilizamos la función FOPEN (pag. 116)

variable= fopen (‘nombrefichero’,’permiso’)

‘nombrefichero’: nombre externo del fichero

‘permiso’ indica el modo de apertura del fichero:

r abre un fichero existente para lectura.


r+ abre un fichero existente para lectura y escritura.
w crea un fichero nuevo para escritura. Si ya existe se borra su contenido
w+ crea un fichero nuevo para escritura y lectura. Si ya existe se borra su
contenido
a abre un fichero para escritura. Si existe escribe al final de lo ya escrito.

variable: identificador del fichero


FICHEROS DE DATOS
OPERACIONES A REALIZAR CON FICHEROS

1º) Apertura del fichero (Ejemplos)


Utilizamos la función FOPEN

fid =fopen(‘datos.txt’,’r’);

fid es un entero positivo si la operación es correcta. Vale -1 si hay un error


Ejemplo de apertura y comprobación:
Ruta completa si no está en la
misma carpeta que el programa
fichero=fopen('C:\ejercicios\puntos.txt’,'r');
if fichero==-1
disp(‘El fichero no se encuentra’);
return;
end
FICHEROS DE DATOS

2º) Cierre del fichero

FCLOSE (pag. 117)

Si se ha finalizado la utilización del fichero, se DEBE desvincular del programa

fclose(fid)
FICHEROS DE DATOS

3º) Escritura de datos en ficheros

Usamos la función FPRINTF (pag. 117-118)

fprintf(fid,’format’,A,….)

En lugar de escribir en pantalla se escribe en el fichero abierto con


identificador fid

Ejemplo: Hacer un programa que reciba un dato numérico de entrada (x), que
calcule el resultado de x + 3 . Esta información en lugar de escribirse en
pantalla se escribirá en un fichero resultados.txt de la forma:

Para el dato ……… el resultado es ……..

(Usando 3 decimales para escribir los números)


FICHEROS DE DATOS

3º) Escritura de datos en ficheros

Usamos la función FPRINTF (pag. 117-118)

fprintf(fid,’format’,A,….)

Ejemplo:

x=0:.1:1
y=[x;exp(x)];

fid=fopen(‘resultado.txt’,’w’);

fprintf(fid,’%4s %12s \n’, ‘x’,’exp(x)’);


fprintf(fid,’%6.2f %12.8f \n’, y);
fclose(fid);
FICHEROS DE DATOS

4º) Rebobinado de ficheros

FREWIND (pag. 118)

frewind(fid)
5º) Lectura de datos de ficheros

Sea el fichero C:\datos\coordenadas.txt

Línea 1 MEDICIÓN REALIZADA 02/11/2016 \n En rojo


Línea 2 123.45 45.67 433.11
433.11\n caracteres no
Línea 3 23.01 11.002 344.113
344.113\n visibles, pero
Línea 4 45.29 211.38 211.42
211.42EOF que existen

Lo que en realidad está guardado en la memoria es:

MEDICIÓN REALIZADA 02/11/2016 \n123.45 45.67 433.11\n23.01 11.002 344.113\n45.29 211.38 211.42EOF
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


(pag. 119-121)

Usaremos las funciones:

fgetl Leen datos


guardándolos en una
fgets cadena (char)

fscanf Lee datos con el formato


que se quiera: números,
texto, …
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FGETL (pag. 119)

cadena=fgetl(fid)

 Lee desde la posición actual hasta el salto de línea (incluido)


 No almacena el salto de línea
 Se guarda lo leído en la variable cadena

Se constituye como una


variable tipo char
 Si cadena toma el valor -1 es que ha encontrado el final
del fichero.
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FGETL (pag. 119)

cadena=fgetl(fid)

Veamos ejemplos:

1. Contenido de cadena

2. Contar líneas de un fichero:


Usamos la propiedad

 Si cadena toma el valor -1 es que ha encontrado el final del fichero.


FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FGETS (pag. 119)

cadena=fgets(fid)
 Lee desde la posición actual hasta el salto de línea (incluido)
 Almacena el salto de línea

 Si cadena toma el valor -1 es que ha encontrado el final


del fichero.

cadena=fgets(fid,n)

Lee desde la posición actual n caracteres


FICHEROS DE DATOS

Lectura de datos de ficheros (EJEMPLOS fgets)

Sea el fichero datos.txt con el siguiente contenido

Precipitaciones por comunidades autónomas


Enero Febrero Marzo Abril Mayo ………
Andalucía 144.2 321.3 105.4 ……………….
Madrid 67.2 89.1 45.7

f1=fopen(‘datos.txt’,’r’);
linea=fgets(f1); Cuando finaliza el programa,
linea=fgets(f1); ¿cuál es el contenido de las
variables linea y ca?
ca=fgets(f1,15);
fclose(f1)
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)
Por ejemplo 6 o bien [3,2]

[A,cont]=fscanf(fid,’formato’,size)
Lee el número de datos indicado
por size en las columnas de A
%d %f %s %c

En general se usa solo un formato que se reutiliza, ya que


se tiene que guardar todo en la misma variable
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%f’,1);

x ???? 8.23
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%d’,1);

x ???? 8
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%c’,1);

x ???? ‘8’
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%s’,1);

x ???? ‘8.23’
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%f’,2);

x ???? 8.23
6.22
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%d’, 2);

x ???? 8
Se para en el
punto, no ‘ve’
más enteros
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%c’, 2);

x ???? ‘8.’
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’,size)

F1=fopen(‘datos.txt’,’r’);
fgets(F1);
x=fscanf(F1,’%s’,2);

x ???? ‘8.236.22’
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

Si no se indica size

[A,cont]=fscanf(fid,’formato’,size)

[A,cont]=fscanf(fid,’formato’)

Se lee, desde la posición actual, todos los datos del fichero (que se
correspondan con el formato) en el vector columna A
Si encuentra un dato que no pueda leer con el formato
indicado, para, y no sigue leyendo.
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

[A,cont]=fscanf(fid,’formato’)
Si encuentra un dato que no pueda leer con el formato indicado,
para y no sigue leyendo.

¿Qué contiene A?
FICHEROS DE DATOS

5º) Lectura de datos de ficheros


FSCANF (pag. 120-121)

Si se quieren leer todos los datos pero en lugar de una columna en


una matriz de n filas.

[A,cont]=fscanf(fid,’formato’,[n, inf])
FICHEROS DE DATOS
Lectura de datos de ficheros (EJEMPLOS)
Sea el fichero datos.txt con el siguiente contenido

fid=fopen(‘datos.txt’,’r’);
[A,cont]=fscanf(fid,’%d’);
[A,cont]=fscanf(fid,’%d’,[2,5]);
frewind(fid);
[A,cont]=fscanf(fid,’%d’,[2,5]);
frewind(fid);
[A,cont]=fscanf(fid,’%d’,[3,3]);

frewind(fid);
[A,cont]=fscanf(fid,’%d’,[4,4]);
frewind(fid);
[A,cont]=fscanf(fid,’%d’,[4,inf]);
PREGUNTA: ¿Cómo leer todos los números en una matriz de 2 columnas?
(manteniendo la distribución)
FICHEROS DE DATOS
6º) Operaciones auxiliares
Búsqueda del final del fichero
FEOF (pag. 121)

feof(fid) ~feof(fid)

NO FINAL FALSO (0) CIERTO (1)


FINAL DEL CIERTO (1) FALSO (0)
FICHERO
FICHEROS DE DATOS
6º) Operaciones auxiliares
Búsqueda del final del fichero
FEOF (pag. 121)

feof(fid) ~feof(fid)

NO FINAL FALSO (0) CIERTO (1)


FINAL DEL CIERTO (1) FALSO (0)
FICHERO

Ejemplo: Sea un fichero ‘res.txt’ con varios datos numéricos. Se quiere contar
cuántos datos hay (n).

fid=fopen('res.txt','r');
n=0;
while ~feof(fid)
fscanf(fid,'%f',1);
n=n+1;
end
FICHEROS DE DATOS

Más ejemplos

Sea ahora el fichero resultados.txt que se encuentra en la carpeta de


trabajo con el siguiente contenido:
Calificaciones del examen final\n
final
Nombre y apellidos Ej1 Ej2 Ej3\n
Sandra Joan Segundo 9 4.5 6\n
Pedro Díaz Sánchez 7 8.1 3.9\n
…………………………………………………………………
…………………………………………………………………………………

El fichero tiene dos líneas de encabezamiento (que explican la información


que contiene) y después un número indeterminado de líneas que contienen el
nombre del alumno (en un campo de 30 caracteres) y las tres calificaciones
de los ejercicios.
Se necesita hacer un programa que calcule la media de las calificaciones
medias del examen.
FICHEROS DE DATOS

Más ejemplos

resultados.txt obtener la media de las calificaciones medias del examen

Calificaciones del examen final\n


Nombre y apellidos Ej1 Ej2 Ej3\n
Sandra Joan Segundo 9 4.5 6\n
Pedro Díaz Sánchez 7 8.1 3.9\n
…………………………………………………………………
…………………………………………………………………………………
FICHEROS DE DATOS

Más ejemplos

(solución)
fid=fopen('resultados.txt','r');
aux=fgets(fid);
aux=fgets(fid);
n=0;
med=[ ];
while ~feof(fid)
fscanf(fid,'%30c',1);
not=fscanf(fid,'%f',[1,3]);
aux=fgets(fid);%para comerse el salto de línea después del tercer número
med=[med,sum(not)/3];
n=n+1;
end
fprintf('El número de alumnos presentados es %d\n',n);
fprintf('La media de notas es: %f\n',sum(med)/n);
FICHEROS DE DATOS

Más ejemplos

(otra solución)
fid=fopen('notas.txt','r');
aux=fgets(fid);
aux=fgets(fid);
n=0;
med=[ ];
while ~feof(fid)
aux=fgets(fid,30);
not=fscanf(fid,'%f',[1,3]);
aux=fgets(fid);%para comerse el salto de línea después del tercer número
med=[med,sum(not)/3];
n=n+1;
end
fprintf('La media de notas es: %f\n',sum(med)/n);
Lectura de datos contenidos en cadenas de caracteres:

Función sscanf
SSCANF (pag. 125)

Dada una variable tipo char se pueden leer los datos contenidos en ella
con diferentes formatos.

Se utiliza de forma similar a fscanf.

fscanf  lee de un fichero


sscanf  lee de una variable char (cadena)

Utilización:
Siempre lee
[A,cont]=sscanf(cadena,'formato',size); desde el inicio
de la cadena
Lectura de datos contenidos en cadenas de caracteres:

EJEMPLOS función sscanf


(pag. 126-127)
dat =
texto='34 45 67'; 34
dat=sscanf(texto,'%d') 45
67

texto='34 45 67'; dat =


34
dat=sscanf(texto,'%d',1)

texto='datos obtenidos: 2 31 23'; dat =


datos
dat=sscanf(texto,'%s',1)

dat =
texto='datos 45 51 Santander'; 45
[dat,n]=sscanf(texto,'%*s %d %d %*s') n =
51

2 % número de datos leídos


NO ENTRA EL USO DE sscanf EN LECTURA DE FICHEROS

NO ENTRA A
PARTIR DE AQUÍ
Más ejemplos

Una empresa ha realizado una serie de mediciones en un


terreno. Los datos se facilitan en el fichero med.txt.
Cada línea del fichero se corresponde con mediciones
realizadas en un día distinto. El número de mediciones de cada
día no tiene que ser el mismo.
Un ejemplo de fichero es:
Se quieren leer todos los
Mediciones obtenidas datos del fichero pero
45 23 21 diferenciando las mediciones
32 41 22 12 de cada día.
43 22 11 Se generará una matriz con
35 contenido:  45 23 21 0 
 
 32 41 22 12 
 43 22 11 0 
 
 35 0 0 0 
¿Podremos hacerlo sin usar sscanf? Lo intentamos …
Ahora sí… …con sscanf

- Leemos encabezado
- Leemos hasta el final del fichero, cada vez una línea
- Usando sscanf, leemos el contenido de esa línea hasta el final
- Se guarda en la fila que corresponda de A

%incluir apertura fichero


encab=fgets(fid);
i=0;
Mediciones obtenidas
while ~feof(fid)
45 23 21
linea=fgets(fid);
32 41 22 12
i=i+1;
43 22 11
[v,c]=sscanf(linea,’%d’);
35
A(i,1:c)=v’;
end
%cierre fichero

También podría gustarte