manejo de archivos en lenguaje c

Embed Size (px)

Citation preview

SEP

SEIT

DGIT

INSTITUTO TECNOLGICO DE NUEVO LAREDO DEPTO. DE SISTEMAS Y COMPUTACIN

Manejo de Archivos en Lenguaje C++Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/takeyas Email: [email protected] Por:

Manejo de Archivos en Lenguaje C++

TABLA DE CONTENIDOPg.

Tabla de figuras.... Prefacio... 1.- CONCEPTOS BSICOS DE ARCHIVOS..1.1. Cmo surge la necesidad de utilizar archivos?................................ 1.2. Relacin entre la memoria principal, el microprocesador y dispositivos de almacenamiento secundario...................................... 1.3. Definiciones de datos, registros y archivos. 1.4. Analogas de archivos y archiveros.. 1.5. Apertura de archivos...... 1.6. Clasificacin de archivos por tipo de contenido..... 1.6.1. Archivos de texto..... 1.6.2. Archivos binarios.. 1.7. Clasificacin de archivos por tipos de acceso....... 1.7.1. Archivos secuenciales.... 1.7.1.1. Consulta o recorrido secuencial. 1.7.2. Archivos directos (relativos, de acceso directo o aleatorios) 1.7.2.1. Direcciones lgicas y direcciones fsicas.. 1.7.2.2. Clculo de direcciones fsicas 1.7.2.3. Consulta directa

5 7 8 8 9 10 12 16 17 18 18 19 20 20 22 22 23 24

2.- FUNCIONES DE MANEJO DE ARCHIVOS EN LENGUAJE C++............................................2.1. Declaracin del alias del archivo.. 2.2. Funciones de manejo de archivos en C++.. 2.2.1. La funcin fopen() y modos de apertura de archivos 2.2.2. Validar la apertura de un archivo.. 2.2.3. Cierre de archivos usando fclose() y fcloseall()... 2.2.4. Escritura de registros usando fwrite()......................... 2.2.4.1. Vaciando los buffers con fflush(). 2.2.5. Lectura de registros usando fread().............................. 2.2.6. Reposicionando el apuntador mediante fseek()............ 2.2.6.1. Puntos de referencia de la funcin fseek().. 2.2.6.2. Conociendo la posicin del apuntador del archivo con la funcin ftell()... 2.2.6.3. Colocando el apuntador del archivo al principio con la funcin rewind()

26 26 26 27 28 29 29 31 31 31 32 34 34

Ing. Bruno Lpez Takeyas , M.C.

2

Manejo de Archivos en Lenguaje C++2.2.7. Detectando el final del archivo con feof()..................... 2.2.8. Cambiando nombres de archivos mediante rename().... 2.2.9. Eliminando archivos con la funcin remove()................. 35 35 36 38 38 39 40 40 42 43 43 43 44 44 46 47 47 49 50 51 53 54 56 57 57 57 59 60 60 62 63 63

3.- APLICACIONES DE ARCHIVOS EN C++.3.1. Declaraciones globales............. 3.2. Archivos secuenciales en Lenguaje C++ 3.2.1. ALTAS secuenciales... 3.2.1.1. Diagrama de flujo de la rutina de ALTAS secuenciales.............................................................. 3.2.1.2. Codificacin de la rutina de ALTAS secuenciales... 3.2.2. CONSULTAS secuenciales... 3.2.2.1. Diagrama de flujo de la rutina de CONSULTAS secuenciales.............................................................. 3.2.2.2. Codificacin de la rutina de CONSULTAS secuenciales.......................................................... 3.2.3. LISTADO secuencial.............. 3.2.3.1. Diagrama de flujo de la rutina de LISTADO secuencial................................................................. 3.2.3.2. Codificacin de la rutina de LISTADO secuencial...... 3.2.4. MODIFICACIONES de datos en un archivo secuencial........... 3.2.4.1. Diagrama de flujo de la rutina de MODIFICACION secuencial................................................................. 3.2.4.2. Codificacin de la rutina de MODIFICACIN secuencial................................................................. 3.2.5. BAJAS de registros en un archivo secuencial (bajas gicas y bajas fsicas)............................................................................ 3.2.5.1. Diagrama de flujo de la rutina de BAJAS lgicas en un archivo secuencial................................................ 3.2.5.2. Codificacin de la rutina de BAJAS lgicas en un archivo secuencial..................................................... 3.2.5.3. Diagrama de flujo de la rutina de BAJAS fsicas en un archivo secuencial (compactar)............................ 3.2.5.4. Codificacin de la rutina de BAJAS fsicas en un archivo secuencial (compactar)................................. 3.3. Archivos directos en Lenguaje C++......... 3.3.1. ALTAS directas........... 3.3.1.1. Diagrama de flujo de la rutina de ALTAS directas...... 3.3.1.2. Codificacin de la rutina de ALTAS directas........... 3.3.2. CONSULTAS directas............ 3.3.2.1. Diagrama de flujo de la rutina de CONSULTAS directas...................................................................... 3.3.2.2. Codificacin de la rutina de CONSULTAS directas.... 3.3.3. MODIFICACIONES directas................. 3.3.3.1. Diagrama de flujo de la rutina de MODIFICACIONES directas.....................................

Ing. Bruno Lpez Takeyas , M.C.

3

Manejo de Archivos en Lenguaje C++3.3.3.2. Codificacin de la rutina de MODIFICACIONES directas...................................................................... 3.3.4. BAJAS de registros en un archivo de acceso directo (bajas lgicas).................................................................................... 3.3.4.1. Diagrama de flujo de la rutina de BAJAS lgicas directas...................................................................... 3.3.4.2. Codificacin de la rutina de BAJAS lgicas directas.. 65 66 67 69 71 72

4.- CONCLUSIONES....................................... 5.-BIBLIOGRAFA...............................................

Ing. Bruno Lpez Takeyas , M.C.

4

Manejo de Archivos en Lenguaje C++

TABLA DE FIGURASNo. Descripcin

Pg. 9 11 11 12 13 17 18 20 21 22 23 23 24 25 27 28 29 30 33 33 34 34 36 37 39 41 42 43 45 46 48 49 52 53 55 56 58 59 61 62 5

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Interaccin entre la memoria principal, el microprocesador y los archivos Formato del registro de Productos.. Declaracin del registro de Productos Formato del registro de Productos.. Cuadro comparativo de archivos y archiveros.. Apertura de archivos. Clasificacin de archivos por contenido. Clasificacin de archivos por tipo de acceso Diagrama de flujo de rutina de consulta secuencial. Ejemplo de clculo del espacio ocupado por un registro El lenguaje C++ maneja archivos con direcciones fsicas.. Direcciones lgicas y fsicas de un archivo... Clculo de la direccin fsica a partir de la direccin lgica Diagrama de flujo de rutina de consulta directa Modos de apertura para archivos de texto y binarios.. La funcin fopen. Validar la apertura de un archivo La funcin fwrite. Puntos de referencia de la funcin fseek... La funcin fseek. La funcin ftell La funcin rewind... La funcin rename. La funcin remove. Declaraciones globales de las aplicaciones.. Diagrama de flujo de rutina de alta secuencial. Codificacin de la rutina de altas secuenciales Codificacin de la rutina de consultas secuenciales.. Diagrama de flujo de rutina de listado secuencial Codificacin de la rutina de listado secuencial. Diagrama de flujo de rutina de modificacin secuencial Codificacin de rutina de modificacin secuencial.. Diagrama de flujo de rutina de baja lgica secuencial Codificacin de rutina de baja lgica secuencial.. Diagrama de flujo de rutina de baja fsica secuencial (compactar)... Codificacin de rutina de baja fsica secuencial (compactar). Diagrama de flujo de rutina de altas directas Codificacin de rutina de altas directas. Diagrama de flujo de rutina de consultas directas Codificacin de rutina de consultas directas.

Ing. Bruno Lpez Takeyas , M.C.

Manejo de Archivos en Lenguaje C++41 42 43 44 Diagrama de flujo de rutina de modificacin directa... Codificacin de rutina de modificaciones directas Diagrama de flujo de rutina de baja lgica directa... Codificacin de rutina de baja lgica directa. 64 65 68 69

Ing. Bruno Lpez Takeyas , M.C.

6

Manejo de Archivos en Lenguaje C++

PREFACIO

Durante el tiempo que he impartido la materia de Administracin de Archivos en la carrera de Ingeniera en Sistemas Computacionales (ISC) en el Instituto Tecnolgico de Nuevo Laredo (ITNL), me he percatado de las deficiencias de los alumnos para programar archivos y, aunque es necesario dominar este aspecto de programacin para aplicarlo en la materia, no es limitante o requisito estricto para cursarla, ya que la retcula as lo seala. Adems estoy enterado que los temas de archivos pertenecen a la ltima unidad programtica de las materias previas de Programacin I y II y que debido a lo extenso de esos programas de estudio, no se comprenden completamente los temas relacionados con archivos. Debido a lo anterior, presento este documento basado en un cmulo de experiencias y dudas planteadas por alumnos que tiene como finalidad reforzar los conocimientos de programacin de archivos en Lenguaje C++ para aplicarlos a necesidades especficas de la materia Administracin de Archivos.

Ing. Bruno Lpez Takeyas, M.C. http://www.itnuevolaredo.edu.mx/takeyas [email protected]

Ing. Bruno Lpez Takeyas , M.C.

7

Manejo de Archivos en Lenguaje C++

1. CONCEPTOS BSICOS DE ARCHIVOSEsta seccin presenta las generalidades relacionadas con archivos antes de empezar a utilizarlos y programarlos. Es necesario involucrarse con la terminologa relacionada como archivo, registro, campo, etc. Tambin es recomendable conocer las clasificaciones generales y las operaciones fundamentales con archivos.

1.1. Cmo surge la necesidad de utilizar archivos?Hasta antes de la materia de Administracin de Archivos, muchas de las aplicaciones que los alumnos de ISC han programado han sido usando la memoria principal o memoria RAM como nico medio de almacenamiento (usando variables, arreglos o estructuras de datos mas complejas), con el inconveniente que esto representa: la volatilidad de la memoria RAM; es decir, si se apaga la computadora se pierden los datos. Adems, algunas aplicaciones exigen transportar los datos de una computadora a otra. De ah surge la necesidad de almacenar dichos datos de forma permanente que permita retenerlos en ciertos dispositivos de almacenamiento secundario por un perodo de tiempo largo sin necesidad de suministrarles energa, de tal forma que permitan transportarlos y utilizarlos en otro equipo computacional.

Ing. Bruno Lpez Takeyas , M.C.

8

Manejo de Archivos en Lenguaje C++RAMRecuerde: Los archivos NO procesan datos, slo los almacenan !!!

Microprocesador Unidad de Control Registros Proceso de grabar datos en el archivo

ALU

Archivo Proceso de cargar datos a la memoria

Fig. 1. Interaccin entre la memoria principal, el microprocesador y los archivos

1.2. Relacin entre la memoria principal, el microprocesador y dispositivos de almacenamiento secundarioExiste una estrecha relacin entre la memoria principal, el microprocesador y los dispositivos de almacenamiento secundario ya que el procesamiento que realiza una computadora es tarea absoluta del microprocesador en conjuncin con

Ing. Bruno Lpez Takeyas , M.C.

9

Manejo de Archivos en Lenguaje C++la memoria principal; es decir, los dispositivos de almacenamiento secundario (diskettes, discos duros, CDs, flash drives, etc.) no procesan datos, slo los almacenan. En estos dispositivos slo se reflejan los datos previamente procesados y funcionan exclusivamente como una bodega. Esto repercute de manera significativa al momento de programar archivos, ya que para hacerle modificaciones a los datos de un registro previamente almacenado es necesario primero cargarlo en la memoria principal, es decir, localizar el registro en el archivo y leerlo para colocar sus datos en la memoria RAM, ah modificarlo y posteriormente grabarlo en la misma posicin en la que se encontraba, sin embargo estas operaciones no se realizan directamente, sino a travs de la unidad aritmtica-lgica, la unidad de control y los registros del microprocesador (Fig. 1).

1.3. Definiciones de datos, registros y archivos Datos: Bsicamente se refieren a los testimonios individuales relacionados con hechos, ya sean caractersticas de ciertos objetos de estudio o condiciones particulares de situaciones dadas. Los elementos individuales de los archivos se llaman datos o campos. Por ejemplo un cheque de un banco tiene los siguientes campos: Cuenta habiente, Nmero de cheque, Fecha, Persona a la que se le paga, Monto numrico, Monto con letra, Nota, Identificacin del banco, Nmero de cuenta y Firma. Cada campo es definido por un tipo de dato. Registro: Es el conjunto completo de datos relacionados pertenecientes a una entrada. P. ejem. Un almacn puede retener los datos de sus productos en registros de acuerdo al formato mostrado en la Fig. 2.

Ing. Bruno Lpez Takeyas , M.C.

10

Manejo de Archivos en Lenguaje C++

No_prod DescripEntero Cadena [30]

CantidadEntero

PrecioReal

GarantiaCaracter

Fig. 2. Formato del registro de ProductosEl registro de la Fig. 2 puede ser declarado globalmente (por encima de la funcin main) el Lenguaje C++ utilizando struct (Fig. 3).

struct tipo_registro { int no_prod; char descrip[30]; int cantidad; float precio; char garantia; }; struct tipo_registro Registro;

Declaracin del tipo de dato (en este caso del tipo de registro)

Ntese ubicacin smbolo ;

la del

Declaracin de la variable Registro de tipo tipo_registro

Fig. 3. Declaracin del registro de Productos. Archivo: En trminos computacionales es una coleccin de datos que tiene un nombre y se guardan en dispositivos de almacenamiento secundario, los cuales pueden ser magnticos, pticos, electrnicos, etc. P. ejem. Diskettes, discos duros, CDs, ZIP drives, flash drives, memory sticks, etc. P. ejem. La Fig. 4 muestra la estructura de un archivo con registros homogneos de Productos (con la misma estructura) declarados previamente (Fig. 3).

Ing. Bruno Lpez Takeyas , M.C.

11

Manejo de Archivos en Lenguaje C++

Archivo: PRODUCTO.SECNo_prod 0 1 2 3 Descrip Camisa de vestir Pantaln para dama Radiograbadora Gabinete para sala Cantidad 100 234 36 54 Precio 65.80 115.50 895.75 1532.60 Garantia N N

Registros

S N

Entero

Cadena [30]

Entero

Real

Caracter

Campos

Fig. 4. Formato del registro de Productos

1.4. Analogas de archivos y archiverosEl modo de operacin de un archivo puede ser asociado con el de un archivero en una oficina, ya que ambos almacenan datos y operan de forma semejante. De tal forma que muestran las siguientes operaciones, acciones similares y comparaciones:

Ing. Bruno Lpez Takeyas , M.C.

12

Manejo de Archivos en Lenguaje C++

Operacin o accin

Archivero

Archivo computacional

Localizando el archivero Identificando la base de Identificar la localizacin de la informacin en particular que contiene datos correspondiente a las carpetas ya con que que la la informacin que se se solicita. Una base de una datos es una coleccin archivos informacin solicita, archiveros clasificados identificados Regularmente donde se encuentra la informacin

oficina puede tener varios de

debidamente relacionados. P. Ejem. e Profesores, alumnos y materias correlacionados. un Se recomienda que los contengan estn

Identificar el lugar exacto archivero contiene varios archivos

cajones, cada uno con datos relacionados con informacin debidamente un objeto de inters en clasificada y ordenada. particular y no de varios. P. Ejem. Slo datos de ALUMNOS.

Ing. Bruno Lpez Takeyas , M.C.

13

Manejo de Archivos en Lenguaje C++Se Nombres los pueden archiveros colocar Los nombres de los

etiquetas a los cajones de archivos estn regidos para por el sistema operativo, regularmente se identificar su contenido de pero contenido clasificacin o de

tal forma que indique el componen del nombre la principal y su extensin, las la cual puede ser de cualquier tipo, es decir, el usuario la puede extensin colocarle

carpetas que contiene.

que desee ya sea DAT, TXT, BIN, JK8, etc. Sin embargo se recomienda que tanto el nombre como la extensin sean relevantes al contenido del archivo. P. Ejem. ALUMNOS.DAT, ARCHIVO.TXT En Operaciones un archivero se Bsicamente un archivo se Lectura Escritura realizan como pueden agregar, extraer o solo tiene 2 operaciones: cambiar documentos de las carpetas.

Las dems operaciones consecuencia de stas.

Ing. Bruno Lpez Takeyas , M.C.

14

Manejo de Archivos en Lenguaje C++Obviamente cuando se Para accesar los datos Apertura requiere consultar agregar carpetas o de un archivo modos de que es de las se del necesario abrirlo. Existen

cajn de un archivero, es varios

necesario primero abrirlo. apertura de los archivos dependiendo operaciones

deseen realizar en l. Los cajones de los Los datos pueden ser

Clasificacin de los datos archiveros

tienen almacenados de muchas y de esto

separadores o pequeas formas diferentes en los pestaas para identificar archivos las la carpetas. insercin o Estas depende la facilidad (o la muestre A estas para ciertas de les del como

facilitan el acceso, ya sea dificultad) que el archivo extraccin de un carpeta operaciones de acceso. en particular. formas almacenamiento se conoce organizacin archivo.

Ing. Bruno Lpez Takeyas , M.C.

15

Manejo de Archivos en Lenguaje C++Cuando ya no se desea Cuando se termina de Cierre utilizar un cajn de un utilizar un archivo es archivero es necesario necesario cerrarlo. De cach y se y cerrarlo, ya que de no esa forma se vaca la hacerlo, se corre el riesgo memoria de daar o perder la asegura informacin. almacenar

proteger los datos.

Algunos Seguridad

archiveros Dependiendo operativo,

del se de aplicar

cuentan con un candado sistema que permite asegurar los pueden

cajones de aperturas no restricciones autorizado.

deseadas por personal no seguridad y acceso a los archivos dependiendo de los usuarios; es decir, se establecen polticas de acceso a usuarios.

Fig. 5. Cuadro comparativo de archivos y archiveros

1.5. Apertura de archivosAntes de escribir o leer datos de un archivo es necesario abrirlo. Al abrir el archivo se establece comunicacin entre el programa y el sistema operativo a cerca de cmo accesarlo. Es necesario que el programa le proporcione al sistema operativo el nombre completo del archivo y la intencin de uso (leer o escribir datos), entonces se definen reas de comunicacin entre ellos. Una de estas

Ing. Bruno Lpez Takeyas , M.C.

16

Manejo de Archivos en Lenguaje C++reas es una estructura que controla el archivo (alias del archivo), de esta forma cuando se solicita una operacin del archivo, se recibe una respuesta que informa el resultado mediante un apuntador. Cada archivo abierto requiere un alias para poder realizar operaciones en l (Fig.6). La estructura del archivo contiene informacin del archivo que se est usando, as como el tamao actual y la localizacin de los buffers de datos.

Programa de archivos

Nombre de archivo Lectura / Escritura Sistema Operativo Apuntador a estruct. de archivo (alias)

Las operaciones en archivos se realizan por medio de su alias.

Archivo

Fig. 6. Apertura de archivos

1.6. Clasificacin de archivos por tipo de contenidoExisten muchas clasificaciones de archivos de acuerdo a diferentes criterios o aplicaciones. Aqu se presenta una muy importante: de acuerdo al contenido.

Ing. Bruno Lpez Takeyas , M.C.

17

Manejo de Archivos en Lenguaje C++

Texto Clasificacin de archivos por contenido Binarios

Fig. 7 Clasificacin de archivos por contenido

1.6.1. Archivos de textoSon aquellos que pueden contener cualquier clase de datos y de tal manera que son entendibles por la gente. Los datos en un archivo de texto se almacenan usando el cdigo ASCII, en el cual cada carcter es representado por un simple byte. Debido a que los archivos de texto utilizan el cdigo ASCII, se pueden desplegar o imprimir. En este tipo de archivos, todos sus datos se almacenan como cadenas de caracteres, es decir, los nmeros se almacenan con su representacin ASCII y no su representacin numrica, por lo tanto no se pueden realizar operaciones matemticas directamente con ellos. P. ejem. Si se guarda el dato 3.141592 en un archivo de texto, se almacena como 3.141592 y ntese que ...

3.141592 3.141592

1.6.2. Archivos binariosEste tipo de archivos almacenan los datos numricos con su representacin binaria. Pueden ser archivos que contienen instrucciones en lenguaje mquina

Ing. Bruno Lpez Takeyas , M.C.

18

Manejo de Archivos en Lenguaje C++listas para ser ejecutadas. Por ejemplo, cuando escribimos un programa en un lenguaje en particular (como C++, Pascal, Fortran, etc), tenemos las instrucciones almacenadas en un archivo de texto llamado programa fuente, pero una vez que lo sometemos a un proceso de compilacin y ejecucin nuestro programa lo trasladamos a un programa ejecutable (en lenguaje mquina), que es directamente entendido por la computadora y se crea un archivo binario. En este tipo de archivos tambin se pueden almacenar diferentes tipos de datos incluyendo datos numricos; sin embargo, cabe destacar que los datos numricos se graban con su representacin binaria (no con su representacin ASCII), por tal razn, cuando se despliegan con un editor de textos o por medio de comandos del sistema operativo, aparecen caracteres raros que no se interpretan. P. ejem. Si se guarda el dato 27 en un archivo binario, se almacena como 00001111 y no como 27.

1.7. Clasificacin de archivos por tipo de accesoDe acuerdo a la forma de acceder los datos de los archivos, stos se clasifican en secuenciales o directos (tambin conocidos como de acceso directo, relativos o aleatorios). En esta seccin no se pretende analizar las diferentes estructuras de datos involucradas en estas clasificaciones de archivos ni desarrollar aplicaciones complejas debidamente diseadas usndolos, sino conocer esencialmente sus conceptos tericos y la forma de manejarlos.

Ing. Bruno Lpez Takeyas , M.C.

19

Manejo de Archivos en Lenguaje C++

Secuenciales Clasificacin de archivos por tipo de acceso Directos (relativos o aleatorios)

Fig. 8. Clasificacin de archivos por tipo de acceso

1.7.1. Archivos secuencialesComo su nombre lo indica, en este tipo de archivos los registros se graban en secuencia o consecutivamente y deben accesarse de ese mismo modo, es decir, conforme se van insertando nuevos registros, stos se almacenan al final del ltimo registro almacenado; por lo tanto, cuando se desea consultar un registro almacenado es necesario recorrer completamente el archivo leyendo cada registro y comparndolo con el que se busca. En este tipo de archivo se utiliza una marca invisible que el sistema operativo coloca al final de los archivos: EOF (End of File), la cual sirve para identificar dnde termina el archivo

1.7.1.1. Consulta o recorrido secuencialA continuacin se muestra un diagrama de flujo de una rutina de consulta de un registro en particular mediante un recorrido secuencial. En esta rutina se maneja un archivo que almacena datos de productos (PRODUCTO.SEC) segn el registro declarado en la Fig. 3 y lo recorre completamente en forma secuencial (registro por registro) hasta encontrar el producto solicitado (Fig. 7).

Ing. Bruno Lpez Takeyas , M.C.

20

Manejo de Archivos en Lenguaje C++CONSULTA SECUENCIAL alias=OPEN (PRODUCTO.SEC) READ Apertura del archivo y asignacin del alias

R

V alias= NULL F No prod

El archivo no existe

return

Lectura del registro completo del archivo controlado por alias

READ (Registro,alias) Ciclo mientras no se encuentre el final del archivoNo se encontr el registro

R

F WHILE NOT EOF (alias)

CLOSE (alias)

V VRegistro.no_prod = no_prodRegistro.no prod, Registro.descrip, Registro.cantidad, Registro.precio Registro.garantia

F

Lectura del siguiente registro completo

Fig. 9. Diagrama de flujo de rutina de consulta secuencial Ing. Bruno Lpez Takeyas , M.C.21

Manejo de Archivos en Lenguaje C++

1.7.2. Archivos directos (relativos, de acceso directo o aleatorios)A diferencia de los archivos secuenciales, en los archivos directos no es necesario recorrerlo completamente para acceder un registro en particular, sino se puede colocar el apuntador interno del archivo directamente en el registro deseado, permitiendo con esto mayor rapidez de acceso. Cabe destacar que para reposicionar este apuntador se utiliza el comando SEEK indicndole la direccin del registro que se desea.

1.7.2.1. Direcciones lgicas y direcciones fsicasEl lenguaje C++ utiliza direcciones fsicas para los archivos (a diferencia de direcciones lgicas de otros lenguajes como PASCAL), esto es, que el direccionamiento consiste en el espacio ocupado por los datos en el archivo (calculado en bytes) no en el rengln al que se asign dicho registro. P. ejem. Suponga que tiene un archivo llamado PRODUCTO.SEC que almacena registros con el formato mostrado en la Fig. 3. Dicho registro tiene cinco campos, cada uno con un tipo de dato determinado, un tamao especfico y que al sumarlos se obtiene el espacio ocupado por cada registro con este formato (Fig.10). Campo no_prod Descrip Cantidad Precio Garantia Tipo de dato Int char [30] int float char TOTAL Tamao en bytes 2 30 2 4 1 39

Fig. 10. Ejemplo de clculo del espacio ocupado por un registro.

Ing. Bruno Lpez Takeyas , M.C.

22

Manejo de Archivos en Lenguaje C++

Los archivos en Lenguaje C++ usan direcciones fsicas y no lgicas como en PASCAL.

Calcule la dir. Fsica antes de reposicionar el apuntador del archivo

Fig.11. El lenguaje C++ maneja archivos con direcciones fsicas

1.7.2.2. Clculo de direcciones fsicasPara poder reposicionar el apuntador de un archivo en un registro especfico es necesario calcular su direccin fsica correspondiente de acuerdo al espacio ocupado por sus registros predecesores.

Archivo: PRODUCTO.SECDir. Lg. 0 1 2 3 4 5 Dir. Fs. 0 41 82 123 164 205 Entero Cadena [30] Entero Real Caracter No_prod 0 1 2 3 Descrip Camisa de vestir Pantaln para dama Radiograbadora Gabinete para sala Cantidad 100 234 36 54 Precio 65.80 115.50 895.75 1532.60 Garantia N N S N

Fig. 12. Direcciones lgicas y fsicas de un archivo.

Ing. Bruno Lpez Takeyas , M.C.

23

Manejo de Archivos en Lenguaje C++De esta forma, para convertir direcciones lgicas en direcciones fsicas se utiliza la frmula mostrada en la Fig. 13.

long int dir_fisica, dir_logica;

La funcin sizeof calcula el tamao en bytes de una variable o estructura

dir_fisica = dir_logica *sizeof(Registro)

Fig. 13. Clculo de la direccin fsica a partir de la direccin lgica

1.7.2.3. Consulta directaA continuacin se muestra un diagrama de flujo de una rutina de consulta directa de un registro en particular. En esta rutina se maneja el archivo PRODUCTO.SEC segn el registro declarado en la Fig. 3. A diferencia del recorrido secuencial, en el que es necesario leer cada registro del archivo, en la consulta directa se calcula la direccin fsica del registro solicitado y se posiciona el apuntador del archivo directamente en ese registro para leerlo (Fig. 14).

Ing. Bruno Lpez Takeyas , M.C.

24

Manejo de Archivos en Lenguaje C++CONSULTA DIRECTA alias=OPEN (PRODUCTO.SEC) READ Apertura del archivo en modo slo lectura y asignacin del alias

V alias= NULL F No prod

El archivo no existe

return

Validacin de la existencia del archivo Clculo de la direccin fsica

dir fisica=No prod*sizeof(Registro)

SEEK (dir_fisica,alias) READ (Registro,alias) Posicionarse en la direccin fsica

Registro.no prod, Registro.descrip, Registro.cantidad, Registro.precio, Registro.garantia

Lectura del registro completo del archivo controlado por alias

CLOSE (alias) Cierre del archivo return

Fig. 14. Diagrama de flujo de rutina de consulta directa Ing. Bruno Lpez Takeyas , M.C.25

Manejo de Archivos en Lenguaje C++

2. FUNCIONES DE MANEJO DE ARCHIVOS EN LENGUAJE C++Esta seccin presenta los aspectos generales de la implementacin de programas de archivos en Lenguaje C++. Aunque se puede almacenar cualquier tipo de datos en archivos, aqu se muestran las operaciones del manejo de registros (struct) en archivos, por lo que las funciones que se mencionan a continuacin son las mas importantes para este tipo de datos.

2.1. Declaracin del alias del archivoPara realizar programas de manejo de archivos en Lenguaje C++ se requiere el encabezado Standard I/O y se necesita incluirlo de la sig. forma:

#include adems es necesario declarar una variable de tipo FILE que opere como el apuntador a la estructura del archivo (alias), esto se logra con la sig. lnea:

FILE *alias;

2.2. Funciones de manejo de archivosEn esta seccin se presentan las funciones ms importantes para el manejo y control de registros en archivos.

Ing. Bruno Lpez Takeyas , M.C.

26

Manejo de Archivos en Lenguaje C++

2.2.1 La funcin fopen() y modos de apertura de archivosSe usa la funcin fopen para abrir un archivo, determinar el modo de apertura y establecer la va de comunicacin mediante su alias correspondiente. Adems determinar el tipo de contenido del archivo (texto o binario). Esta funcin tiene dos argumentos: el nombre del archivo y su modo (Fig. 16). La Fig. 15 muestra los modos de apertura de archivos de texto y binarios. Modo de apertura (archivos de texto) r Modo de apertura (archivos binarios) rb Apertura en modo de slo lectura. El archivo debe existir. Apertura en modo de slo escritura. Si el archivo w wb existe, se reescribir (pierde el contenido anterior). Si el archivo no existe, lo crea. Apertura en modo de agregar. Si el archivo existe, a ab los datos se agregan al final del archivo, en caso contrario, el archivo se crea. r+ w+ a+ rb+ wb+ ab+ Apertura en modo de lectura/escritura. El archivo debe existir. Apertura en modo de lectura/escritura. Si el archivo existe, se reescribir (pierde el contenido anterior). Apertura en modo de lectura/agregar. Si el archivo no existe lo crea. Operacin

Fig. 15. Modos de apertura para archivos de texto y binarios.

Ing. Bruno Lpez Takeyas , M.C.

27

Manejo de Archivos en Lenguaje C++#include FILE *alias1, *alias2, *alias3; Abre el archivo binario EJEMPLO.DAT en modo de slo lectura y lo asigna al apuntador

alias1 = fopen(EJEMPLO.DAT, rb); alias2 = fopen(ARCHIVO.TXT, ab); alias3 = fopen(c:\\tarea\\PRODUCTO.005, w); Crea el archivo de texto PRODUCTO.005 en modo de slo escritura y lo asigna al apuntador alias3. El archivo lo crea en el subdirectorio c:\tarea

Ntese que se necesitan dos \ ya que el backslash indica el inicio de una secuencia de escape en C++

Fig. 16. La funcin fopen

2.2.2. Validar la apertura de un archivoAlgunas funciones requieren la existencia del archivo para realizar operaciones, por ello es necesario verificar que cuando se intenta abrir un archivo haya tenido xito la operacin. Si un archivo no se puede abrir, la funcin fopen devuelve el valor de 0 (cero), definido como NULL en stdio.h. La Fig. 17 muestra un ejemplo de la manera de detectar la apertura de un archivo.

Ing. Bruno Lpez Takeyas , M.C.

28

Manejo de Archivos en Lenguaje C++#include FILE *alias; alias = fopen(EJEMPLO.DAT, rb); if (alias==NULL) { cout no_prod; fread(&Registro,sizeof(Registro),1,alias);

Ing. Bruno Lpez Takeyas , M.C.

43

Manejo de Archivos en Lenguaje C++// Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" while(!feof(alias)) { if(Registro.no_prod==no_prod) { cout no_prod; dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo fread(&Registro,sizeof(Registro),1,alias); // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" if(Registro.no_prod==no_prod) { cout no_prod; dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo fread(&Registro,sizeof(Registro),1,alias); // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" if(Registro.no_prod==no_prod) { cout no_prod; dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo fread(&Registro,sizeof(Registro),1,alias); // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" if(Registro.no_prod==no_prod) { cout