programación i - unidad 6: punteros, apuntadores o archivos

47
Freddy Tejada - Escobar, MSc. Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Upload: others

Post on 19-Jul-2022

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Freddy Tejada-Escobar, MSc.

Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Page 2: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Declaraciones e inicialización de variables apuntadores

Operadores de apuntadores

Paso de argumentos a funciones por referencia mediante apuntadores

Uso de const con apuntadores

Ordenamiento por selección mediante el uso del paso por referencia

Operador sizeof

Expresiones y aritmética de apuntadores

Relación entre apuntadores y arreglos

Arreglos de apuntadores

Apuntadores a funciones

Introducción al procesamiento de cadenas basadas en apuntador

Page 3: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Los Punteros o Apuntadores, son variables que contienen la dirección de otravariable.

Los usos principales, que tienen, los punteros, son los siguientes:

Nos ayuda, para que una función devuelva más de un valor. Por ejemplo, unafunción que devuelva un vector de enteros, en dicha función mandamos ladirección del primer elemento a la función principal, y a partir de ella,imprimimos todos los valores contenidos en el vector.

Mejor uso de la memoria dinámica. Esto es lo que más nos tiene cuenta, ellector debe tener presente que, el uso de punteros, ayuda a ahorrar memoriay por consiguiente, hace más efectivo el uso y administración de la misma.

Page 4: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Las generalidades relacionadas con archivos antes de empezar a utilizarlos yprogramarlos. Es necesario involucrarse con la terminología relacionada comoarchivo, registro, campo, etc. También es recomendable conocer lasclasificaciones generales y las operaciones fundamentales con archivos.

¿Cómo surge la necesidad de utilizar archivos?

Hasta este instante sólo hemos trabajado ejecutando los programas yalmacenándolos en la memoria R.A.M.

Pero algunas aplicaciones exigen transportar los datos de una computadora aotra. De ahí surge la necesidad de almacenar dichos datos de forma permanenteque permita retenerlos en ciertos dispositivos de almacenamiento secundariopor un período de tiempo largo sin necesidad de suministrarles energía, de talforma que permitan transportarlos y utilizarlos en otro equipo computacional.

Page 5: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Page 6: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Definiciones básicas

Datos: Básicamente se refieren a los testimonios individuales relacionados conhechos, ya sean características de ciertos objetos de estudio o condicionesparticulares de situaciones dadas. Los elementos individuales de los archivos sellaman datos o campos. Por ejemplo: un cheque de un banco tiene los siguientescampos: Cuenta habiente, Número de cheque, Fecha, Persona a la que se le paga,Monto numérico, Monto con letra, Nota, Identificación del banco, Número decuenta y Firma. Cada campo es definido por un tipo de dato.

Page 7: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Definiciones básicas

Registro: Es el conjunto completo de datos relacionados pertenecientes a unaentrada. Por ejemplo: Un almacén puede retener los datos de sus productos enregistros de acuerdo al formato.

Registro:

Page 8: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Definiciones básicas

Registro:

Page 9: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Definiciones básicas

Archivo: En términos computacionales es una colección de datos que tiene unnombre y se guardan en dispositivos de almacenamiento secundario, los cualespueden ser magnéticos, ópticos, electrónicos, etc. Por ejemplo: discos durosinternos o externos, CD´s, ZIP drives, flash drives, memory sticks, entre otrasunidades de almacenamiento.

Page 10: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Introducción

Definiciones básicas

Archivo:

Page 11: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Declaraciones e inicialización de variables apuntadores Antes de escribir o leer datos de un archivo es necesario abrirlo. Al abrir el

archivo se establece comunicación entre el programa y el sistema operativo acerca de cómo accesarlo. Es necesario que el programa le proporcione al sistemaoperativo el nombre completo del archivo y la intención de uso (leer o escribirdatos), entonces se definen áreas de comunicación entre ellos. Una de estasáreas es una estructura que controla el archivo (alias del archivo), de esta formacuando se solicita una operación del archivo, se recibe una respuesta que informael resultado mediante un apuntador. Cada archivo abierto requiere un alias parapoder realizar operaciones en él.

Page 12: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Declaraciones e inicialización de variables apuntadores La estructura del archivo contiene información del archivo que se está usando, así

como el tamaño actual y la localización de los buffers de datos.

Page 13: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Declaraciones e inicialización de variables apuntadores Las declaraciones de punteros o apuntadores, pueden ser:

Variables con un tipo de dato asociado

int *ptr;

char *texto;

FILE *alias;

Los apuntadores pueden ser inicializados con valor NULL o un dato particular.

Page 14: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Declaraciones e inicialización de variables apuntadores C define la estructura de datos FILE en el fichero de

cabecera stdio.h para el manejo de ficheros. Nosotros siempreusaremos punteros a estas estructuras.

La definición de ésta estructura depende del compilador, pero engeneral mantienen un campo con la posición actual delectura/escritura, un buffer para mejorar las prestaciones de acceso alfichero y algunos campos para uso interno.

Page 15: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Operadores de apuntadores

Operador de dirección (&)

Aplicado sobre una variable devuelve la dirección en memoria dondeestá almacenada.

Ejemplo:1. int *intPtr, n;

2. intPrt = &n; //intPtr apunta a n

Page 16: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Operadores de apuntadores

Operador de indirección (*)

Aplicado sobre un puntero retorna el valor al que apunta.

Ejemplo:1. int *intPtr; //intPtr es un puntero que apunta a una variable de tipo int.

2. int n = 5; //n es una variable de tipo int.

3. intPtr = &n; //intPtr apunta a n.

4. *intPtr = 6; //n es ahora 6

Page 17: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Operadores de apuntadores

Operador de indirección (*)

El operador de indirección también es útil si queremos visualizar las direccionesalas que apunta un puntero, aunque esto es un caso poco común.

Veamos un ejemplo:

1. int i = 10;

2. int *entero = &i;

3. cout << entero << endl;

4. cout << *entero << endl;

La tercera línea mostrará la dirección a la que apunta entero

La cuarta línea mostrará 10

Page 18: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

Page 19: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

En cuanto al tipo de acceso, en C y C++ podemos clasificar los archivos segúnvarias categorías:

Dependiendo de la dirección del flujo de datos:

De entrada: los datos se leen por el programa desde el archivo.

De salida: los datos se escriben por el programa hacia el archivo.

De entrada/salida: los datos pueden se escritos o leídos.

Page 20: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

Dependiendo del tipo de valores permitidos a cada byte:

De texto: sólo están permitidos ciertos rangos de valores para cada byte.Algunos bytes tienen un significado especial, por ejemplo, el valorhexadecimal 0x1A marca el fin de fichero. Si abrimos un archivo en modotexto, no será posible leer más allá de un byte con ese valor, aunque el ficherosea más largo.

Binarios: están permitidos todos lo valores para cada byte. En estos archivosel final del fichero se detecta de otro modo, dependiendo del soporte y delsistema operativo. La mayoría de las veces se hace guardando la longitud delfichero. Cuando queramos almacenar valores enteros, o en coma flotante, oimágenes, etc, deberemos usar este tipo de archivos.

Page 21: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

Según el tipo de acceso: Archivos secuenciales: imitan el modo de acceso de los antiguos ficheros

secuenciales almacenados en cintas magnéticas y

Archivos de acceso aleatorio: permiten acceder a cualquier punto de ellospara realizar lecturas y/o escrituras.

Page 22: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos Según la longitud de registro:

Longitud variable: en realidad, en este tipo de archivos no tiene sentido hablar delongitud de registro, podemos considerar cada byte como un registro. También puedesuceder que nuestra aplicación conozca el tipo y longitud de cada dato almacenado enel archivo, y lea o escriba los bytes necesarios en cada ocasión. Otro caso es cuando seusa una marca para el final de registro, por ejemplo, en ficheros de texto se usa elcarácter de retorno de línea para eso. En estos casos cada registro es de longituddiferente.

Longitud constante: en estos archivos los datos se almacenan en forma de registro detamaño constante. En C usaremos estructuras para definir los registros. C dispone defunciones de biblioteca adecuadas para manejar este tipo de ficheros.

Mixtos: en ocasiones pueden crearse archivos que combinen los dos tipos de registros,por ejemplo, dBASE usa registros de longitud constante, pero añade un registroespecial de cabecera al principio para definir, entre otras cosas, el tamaño y el tipo delos registros.

Page 23: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

Es posible crear archivos combinando cada una de estas categorías, por ejemplo:archivos secuenciales de texto de longitud de registro variable, que son los típicosarchivos de texto. Archivos de acceso aleatorio binarios de longitud de registroconstante, normalmente usados en bases de datos. Y también cualquiercombinación menos corriente, como archivos secuenciales binarios de longitudde registro constante, etc.

En cuanto a cómo se definen estas propiedades, hay dos casos. Si son binarios ode texto o de entrada, salida o entrada/salida, se define al abrir el fichero,mediante la función fopen en C o mediante el método open de fstream en C++.

La función open usa dos parámetros. El primero es el nombre del fichero quecontiene el archivo. El segundo es en modo que es una cadena que indica elmodo en que se abrirá el archivo: lectura o escritura, y el tipo de datos quecontiene: de texto o binarios.

Page 24: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

En C, los ficheros admiten seis modos en cuanto a la dirección del flujo de datos:

r: sólo lectura. El fichero debe existir.

w: se abre para escritura, se crea un fichero nuevo o se sobrescribe si yaexiste.

a: añadir, se abre para escritura, el cursor se sitúa al final del fichero. Si elfichero no existe, se crea.

r+: lectura y escritura. El fichero debe existir.

w+: lectura y escritura, se crea un fichero nuevo o se sobrescribe si ya existe.

a+: añadir, lectura y escritura, el cursor se sitúa al final del fichero. Si elfichero no existe, se crea.

Page 25: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Clasificación de los archivos

En cuanto a los valores permitidos para los bytes, se puede añadir otro carácter ala cadena de modo:

t: modo texto. Normalmente es el modo por defecto. Se suele omitir.

b: modo binario.

En ciertos sistemas operativos no existe esta distinción, y todos los ficherosson binarios.

En C++ es algo diferente, el constructor de las clases ifstream, ofstream y fstreamadmite los parámetros para abrir el fichero directamente, y también disponemosdel método open, para poder crear el stream sin asociarlo con un ficheroconcreto y hacer esa asociación más tarde.

Page 26: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Funciones básicas para archivos

Page 27: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fopen

Sintaxis:

Esta función sirve para abrir y crear ficheros en disco. El valor deretorno es un puntero a una estructura FILE. Los parámetros de entradason:

Page 28: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fopen1. nombre: una cadena que contiene un nombre de fichero válido, esto

depende del sistema operativo que estemos usando. El nombre puedeincluir el camino completo.

2. modo: especifica en tipo de fichero que se abrirá o se creará y el tipo dedatos que puede contener, de texto o binarios: r: sólo lectura. El fichero debe existir.

w: se abre para escritura, se crea un fichero nuevo o se sobre-escribe si ya existe.

a: añadir, se abre para escritura, el cursor se sitúa al final del fichero. Si el fichero noexiste, se crea.

r+: lectura y escritura. El fichero debe existir.

w+: lectura y escritura, se crea un fichero nuevo o se sobre-escribe si ya existe.

a+: añadir, lectura y escritura, el cursor se sitúa al final del fichero. Si el fichero no existe,se crea.

t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t"

b: tipo binario.

Page 29: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fopen Ejemplo:

nombre: descriptor de nombre del archivo.

modo: tipo de archivo que se abrirá o creará.

Page 30: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fcloseSintaxis:

Es importante cerrar los ficheros abiertos antes de abandonar la aplicación. Estafunción sirve para eso. Cerrar un fichero almacena los datos que aún están en elbuffer de memoria, y actualiza algunos datos de la cabecera del fichero quemantiene el sistema operativo. Además permite que otros programas puedanabrir el fichero para su uso. Muy a menudo, los ficheros no pueden sercompartidos por varios programas.

Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, siha habido algún error, el valor de retorno es la constante EOF. El parámetro es unpuntero a la estructura FILE del fichero que queremos cerrar.

Page 31: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fgetcSintaxis:

Esta función lee un carácter desde un fichero.

El valor de retorno es el carácter leído como un unsigned char convertido a int. Si no hay ningún carácter disponible, el valor de retorno es EOF. El parámetro es un puntero a una estructura FILE del fichero del que se hará la lectura.

Page 32: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fputcSintaxis:

Esta función escribe un carácter a un fichero.

El valor de retorno es el carácter escrito, si la operación fue completada con éxito, en caso contrario será EOF. Los parámetros de entrada son el carácter a escribir, convertido a int y un puntero a una estructura FILE del fichero en el que se hará la escritura.

Page 33: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: feofSintaxis:

Esta función sirve para comprobar si se ha alcanzado el final del fichero. Muyfrecuentemente deberemos trabajar con todos los valores almacenados en unarchivo de forma secuencial, la forma que suelen tener los bucles para leer todoslos datos de un archivo es permanecer leyendo mientras no se detecte el fin defichero. Esta función suele usarse como prueba para verificar si se ha alcanzado ono ese punto.

El valor de retorno es distinto de cero sólo si no se ha alcanzado el fin de fichero.El parámetro es un puntero a la estructura FILE del fichero que queremosverificar.

Page 34: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: rewindSintaxis:

Es una función heredada de los tiempos de las cintas magnéticas. Literalmentesignifica "rebobinar", y hace referencia a que para volver al principio de unarchivo almacenado en cinta, había que rebobinarla. Eso es lo que hace éstafunción, sitúa el cursor de lectura/escritura al principio del archivo.

El parámetro es un puntero a la estructura FILE del fichero que queremosrebobinar.

Ejemplo:

Page 35: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: rewindEjemplo:

Ver código

Page 36: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fgetsSintaxis:

Esta función está diseñada para leer cadenas de caracteres. Leerá hasta n-1caracteres o hasta que lea un retorno de línea. En este último caso, el carácter deretorno de línea también es leído.

El parámetro n nos permite limitar la lectura para evitar desbordar el espaciodisponible en la cadena.

El valor de retorno es un puntero a la cadena leída, si se leyó con éxito, yes NULL si se detecta el final del fichero o si hay un error. Los parámetros son: lacadena a leer, el número de caracteres máximo a leer y un puntero a unaestructura FILE del fichero del que se leerá.

Page 37: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fputsSintaxis:

La función fputs escribe una cadena en un fichero. No se añade el carácter deretorno de línea ni el carácter nulo final.

El valor de retorno es un número no negativo o EOF en caso de error. Losparámetros de entrada son la cadena a escribir y un puntero a laestructura FILE del fichero donde se realizará la escritura.

Page 38: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: freadSintaxis:

Esta función está pensada para trabajar con registros de longitud constante. Escapaz de leer desde un fichero uno o varios registros de la misma longitud y apartir de una dirección de memoria determinada. El usuario es responsable deasegurarse de que hay espacio suficiente para contener la información leída.

El valor de retorno es el número de registros leídos, no el número de bytes. Losparámetros son: un puntero a la zona de memoria donde se almacenarán losdatos leídos, el tamaño de cada registro, el número de registros a leer y unpuntero a la estructura FILE del fichero del que se hará la lectura.

Page 39: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fwriteSintaxis:

Esta función también está pensada para trabajar con registros de longitudconstante y forma pareja con fread. Es capaz de escribir hacia un fichero uno ovarios registros de la misma longitud almacenados a partir de una dirección dememoria determinada.

El valor de retorno es el número de registros escritos, no el número de bytes. Losparámetros son: un puntero a la zona de memoria donde se almacenarán losdatos leídos, el tamaño de cada registro, el número de registros a leer y unpuntero a la estructura FILE del fichero del que se hará la lectura.

Ejemplo:

Page 40: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fwriteEjemplo:

Ver código

Page 41: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fprintfSintaxis:

La función fprintf funciona igual que printf en cuanto a parámetros,pero la salida se dirige a un fichero en lugar de a la pantalla.

Page 42: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fscanfSintaxis:

La función fscanf funciona igual que scanf en cuanto a parámetros,pero la entrada se toma de un fichero en lugar del teclado.

Page 43: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fflushSintaxis:

Esta función fuerza la salida de los datos acumulados en el buffer de salidadel fichero. Para mejorar las prestaciones del manejo de ficheros se utilizanbuffers, almacenes temporales de datos en memoria, las operaciones de salida sehacen a través del buffer, y sólo cuando el buffer se llena se realiza la escritura enel disco y se vacía el buffer. En ocasiones nos hace falta vaciar ese buffer de unmodo manual, para eso sirve ésta función.

El valor de retorno es cero si la función se ejecutó con éxito, y EOF si hubo algúnerror. El parámetro de entrada es un puntero a la estructura FILE del fichero delque se quiere vaciar el buffer. Si es NULL se hará el vaciado de todos los ficherosabiertos.

Page 44: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Ejemplo:A través de programación estructurada, crea registros y lee

registros.

Ejemplo completo

Page 45: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Funciones específicas para archivos de acceso aleatorio

Page 46: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: fseekSintaxis:

Esta función sirve para situar el cursor del fichero para leer o escribir en el lugar deseado.

El valor de retorno es cero si la función tuvo éxito, y un valor distinto de cero si hubo algún error.

Los parámetros de entrada son: un puntero a una estructura FILE del fichero en el que queremoscambiar el cursor de lectura/escritura, el valor del desplazamiento y el punto de origen desde elque se calculará el desplazamiento.

El parámetro origen puede tener tres posibles valores:

1. SEEK_SET el desplazamiento se cuenta desde el principio del fichero. El primer byte delfichero tiene un desplazamiento cero.

2. SEEK_CUR el desplazamiento se cuenta desde la posición actual del cursor.

3. SEEK_END el desplazamiento se cuenta desde el final del fichero.

Page 47: Programación I - Unidad 6: Punteros, Apuntadores o Archivos

Función: ftellSintaxis:

La función ftell sirve para averiguar la posición actual del cursor delectura/escritura de un fichero.

El valor de retorno será esa posición, o -1 si hay algún error.

El parámetro de entrada es un puntero a una estructura FILE del fichero del quequeremos leer la posición del cursor de lectura/escritura.