Title: Unidad temtica 5
1Unidad temática 5
- Aspectos avanzados
- Objetivos
- Conocer el concepto de fichero y puntero
- Conocer las operaciones que pueden realizarse con
ellos - Aplicar ambos conceptos a la resolución de
problemas - Contenidos
- Tema 11. Ficheros
- Tema 12. Variables dinámicas
2Tema 10
- Ficheros
- Definición de fichero
- Tipos de ficheros de texto y binarios
- Tipos de acceso a fichero secuencial y aleatorio
- Apertura y cierre de ficheros
- Archivos de texto
- Lectura y escritura en ficheros de acceso
secuencial - Lectura y escritura en ficheros de acceso
aleatorio - Archivos binarios
Bibliografía - (1) tema 11
3Definición de fichero
- Por qué se necesita utilizar almacenamiento
secundario? - Proceso de gran cantidad de datos
- Limitación de la memoria del ordenador
- Programas que tratan cierta información de la que
han de disponer en posteriores ejecuciones
4Concepto de fichero
- Fichero o archivo
- Cadena de bytes consecutivos que termina en un
carácter especial llamado EOF (End Of File)
5Ficheros de texto y binarios
- Forma en la que el programa que trata con el
fichero va a interpretar la información contenida
en él. - Una vez se ha creado un fichero y la información
se ha insertado en forma binaria o de texto,
siempre se deberá trabajar del mismo modo.
6Tipos de acceso secuencial
- Leer o escribir datos comenzando siempre desde el
principio del archivo. - Añadir datos a partir del final del archivo.
- Poco eficiente.
7Tipos de acceso aleatorio
- Acceder directamente a cualquier posición dada de
un archivo para actualizar los valores contenidos
a partir de dicho punto. - Implica la utilización de operaciones nuevas que
permitan situarse en cualquier punto del archivo.
8Apertura y cierre de ficheros
- Apertura
- FILE fopen (char pathname, char type)
- pathname cadena de caracteres que indica el
nombre del fichero, incluido el camino - type cadena que contiene el tipo de fichero y
su modo de apertura - Cierre
- int fclose (FILE file)
9Modos de apertura
10Ejemplo apertura y cierre
- include ltstdio.hgt
- void main()
- FILE pf
- pf fopen(c\\temp\\fichero.txt, w)
- if (pfNULL)
- printf (Error en la apertura del fichero\n)
- exit (-1)
-
- ...
- fclose (pf)
11Archivos de texto secuenciales Lectura
- Función fscanf
- int fscanf (FILE pf, char formato, variables)
- lee hasta encontrar un blanco o final de línea
- devuelve el número de ítems leídos o EOF si llega
a final de fichero - Función fgets
- char fgets (char s, int n, FILE pf)
- lee n caracteres de pf o hasta que encuentra un
carácter de final de línea y los almacena en s
junto con \0 - devuelve la cadena leída o NULL si llega a final
de fichero
12Ejemplo de fscanf
- Lectura de varias cadenas de caracteres separadas
por blancos con fscanf - include ltstdio.hgt
- void main()
- FILE pf
- char vector50
- pf fopen(c\\temp\\fichero.txt, r)
- while (fscanf (pf, s, vector) ! EOF)
- printf (Leido s\n, vector)
- fclose (pf)
-
13Ejemplo de fgets
- Lectura de varias cadenas de caracteres con fgets
- include ltstdio.hgt
- void main()
- FILE pf
- char vector50
- pf fopen(c\\temp\\fichero.txt, r)
- while (fgets (vector, 50, pf)!NULL)
- printf (Leido s\n, vector)
- fclose (pf)
-
14Ejemplo de fscanf (2)
- Lectura de datos de distintos tipos de un archivo
de texto. - include ltstdio.hgt
- void main()
- FILE pf
- float precio int unidades char pieza50
- pf fopen(c\\temp\\fichero.txt, r)
- fscanf (pf, sdf, pieza, unidades,
precio) - printf (Pieza s, cantidad d y precio
f\n, pieza, unidades, precio) - fclose (pf)
15Archivos de texto secuenciales Escritura
- Función fprintf
- int fprintf (FILE pf, char formato, argumentos)
- escribe el contenido de los argumentos
- devuelve el número de ítems escritos en el
fichero o un número negativo en caso de error
16Ejemplo de fprintf
- Escritura de datos de distintos tipos en un
archivo de texto. - include ltstdio.hgt
- void main()
- FILE pf
- float precio int unidades char pieza50
- printf (Introduce pieza, cantidad y
precio\n) - scanf (sdf, pieza, unidades, precio)
- pf fopen(c\\temp\\fichero.txt, w)
- fprintf (pf, s d f , pieza, unidades,
precio) - fclose (pf)
-
17Archivos de texto aleatorios
- Se utilizan las mismas funciones para lectura y
escritura que para ficheros de texto de acceso
secuencial - fscanf
- fgets
- fprintf
18Archivos de texto aleatorios
- Es necesario utilizar funciones que permitan
posicionar el puntero del fichero. -
- int fseek (FILE pf, long int desplaz, int modo)
- desplaz es el desplazamiento en bytes a efectuar
- modo es el punto de referencia que se toma para
efectuar dicho desplazamiento - SEEK_SET principio del fichero
- SEEK_CUR posición actual
- SEEK_END final del fichero
- devuelve 0 si se ha realizado el desplazamiento o
distinto de cero si ha ocurrido algún error
19Ejemplo de fseek
- Supongamos que el fichero fichero.txt contiene la
cadena Este es el texto del fichero. Este
programa lee diversas palabras del mismo. - include ltstdio.hgt
- void main()
- FILE pf
- char cadena50
- pf fopen(c\\temp\\fichero.txt, r)
- fscanf (pf, s, cadena)
- printf (Primera palabra s\n, cadena)
- fseek (pf, 4, SEEK_CUR)
-
20Ejemplo de fseek (cont.)
- fscanf (pf, s, cadena)
- printf (Tercera palabra s\n, cadena)
- fseek (pf, -7, SEEK_END)
- fscanf (pf, s, cadena)
- printf (Ultima palabra s\n, cadena)
- fseek (pf, 11, SEEK_SET)
- fscanf (pf, s, cadena)
- printf (Cuarta palabra s\n, cadena)
- fclose (pf)
-
21Ejemplo de fseek (cont. 2)
- La salida del programa sería la siguiente
- Primera palabra Este
- Tercera palabra el
- Ultima palabra fichero
- Cuarta palabra texto
22Archivos binarios
- Se utilizan funciones que leen y escriben sin
interpretar los datos, es decir, son funciones
que leen y escriben bytes - fread, para lectura
- fwrite, para escritura
23Ejemplo archivos binarios
- include ltstdio.hgt
- void main()
- FILE pf
- float v1.43, 4e-5, 32.01, 0.2e1
- pffopen (c\\temp\\fichero.dat, wb)
- fwrite (v, sizeof(float), 4, pf)
- fread (v, sizeof(float), 4, pf)
- printf (Los numeros leidos son f f f f\n,
v0,v1,v2,v3) - fclose (pf)
24Tema 11
- Variables dinámicas
- Conceptos básicos
- Punteros. Ejemplos
- Paso de punteros a funciones
- Asignación dinámica de memoria. Ejemplos
- Punteros y vectores
- Operaciones con vectores
- Diferencia entre vectores estáticos y dinámicos
- Matrices dinámicas
Bibliografía - (1) tema 10
25Conceptos básicos
- Operador de dirección de memoria ()
- sobre objetos en memoria
- a dirección de memoria de a
- Operador de indirección ()
- sobre operandos que representen direcciones de
memoria - (a) contenido de a
-
26Punteros
- Puntero variable que almacena una dirección de
memoria - p a
- Declaración de punteros
- tipo_dato nombre_variable_puntero
- int a, p
- NULL valor nulo de un puntero
- librería stdlib.h
27Ejemplos
- float v, pvv int v
- int u, puu int pv
- v8
- pvv
- int u3, v int u1, u2
- int pv, pu int v3
- puu int pv
- vpu pvv
- pvv u12(v5)
- printf (ud, vd, pvd, u22(pv5)
- pud, u,v,pv,pu)
28Ejemplos (2)
- int v3, pv
- pvv
- pv0
- printf (\n vd pvd, v, pv)
- int pv, pu, u, v1
- pvv
- pvpv10
- pvpv1
- upv2
- pupv
29Paso de punteros a funciones
- Implementa el paso por referencia
- include ltstdio.hgt
- include ltstdlib.hgt
- void fun_invocada (int vble_recibir)
- vble_recibir vble_recibir1
-
- void fun_invocadora ()
- int vble_enviar4
- fun_invocada (vble_enviar)
- printf (Valor de la variable
d\n,vble_enviar) -
- main() fun_invocadora()
30Asignación dinámica de memoria
- Reserva de memoria en tiempo de ejecución
- Función malloc de la librería stdlib.h
- void malloc (int num_bytes_memoria)
- malloc (num_elementossizeof(tipo_dato))
- Función free de la librería stdlib.h
- void free (void )
31Ejemplos
- include ltstdlib.hgt
- main ()
- int dato_simple
- dato_simple (int ) malloc (1sizeof(int))
-
- include ltstdlib.hgt
- main ()
- int dato_simple, int num
- scanf (d, num)
- dato_simple(int ) malloc (numsizeof(int))
-
32Punteros y vectores
- El nombre del vector es una dirección de memoria
- Significado físico de un vector
- int datos3 datos0 dir. datos
- datos1 dir. (datos1)
- datos2 dir. (datos2)
33Operaciones sobre vectores
- Operador
- datos0 datos (datos0)
- datos1 (datos1)
- Operador
- datos0 datos
- datos1 (datos1)
- Operador (indexación)
- nombre_vectori (nombre_vectori)
34Diferencia entre vectores estáticos y dinámicos
- int datos3
- int datos
-
- datos (int ) malloc (3sizeof(int))
-
- free(datos)
35Ejemplo Lectura de un vector dinámico
- include ltstdio.hgt
- include ltstdlib.hgt
- int leervector(int vector, int longitud)
- int i
- for (i0 iltlongitud i)
- printf (\n Introduce un numero )
- scanf (d, vectori)
-
-
- main ()
- int vector, num, val
- printf (Cuantos numeros seran introducidos?
) - scanf (d, num)
- vector (int ) malloc (numsizeof(int))
- leervector (vector, num)
- free (vector)
36Matrices dinámicas
- Método 1 vector de vectores
- permite usar las matrices con 2 índices
- int matriz, i, j, filas, cols
- ...
- matriz (int ) malloc (filas sizeof(int))
- for (i0 iltfilas i)
- matrizi (int ) malloc (cols sizeof(int))
- matriz02 3
37Matrices dinámicas (2)
- Método 2 matriz lineal
- más sencilla de declarar pero más complicada de
utilizar (un solo índice) - int matriz, indice, filas, cols
- ...
- matriz (int ) malloc (filascolssizeof(int))
- for (i0 iltfilas i)
- for (j0 jltcols j)
- indice icols j
- matrizindice 0
-