Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo de Arhivos en Lenguaje C
Manejo de Arhivos en Lenguaje C
SEIT
DGIT
TABLA DE CONTENIDO
Pg.
5 7 8 8 9 10 12 16 17 18 18 19 20 20 22 22 23 24
26 26 26 27 28 29 29 31 31 31 32 34 34
TABLA DE FIGURAS
No. 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.
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.
ALU
10
No_prod Descrip
Entero Cadena [30]
Cantidad
Entero
Precio
Real
Garantia
Caracter
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)
la del
11
Archivo: PRODUCTO.SEC
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
Registros
S N
Entero
Cadena [30]
Entero
Real
Caracter
Campos
12
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
debidamente relacionados. P. Ejem. e Profesores, alumnos y materias correlacionados. un Se recomienda que los contengan estn
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.
13
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
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.
14
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.
15
Algunos Seguridad
del se de aplicar
deseadas por personal no seguridad y acceso a los archivos dependiendo de los usuarios; es decir, se establecen polticas de acceso a usuarios.
16
Programa de archivos
Nombre de archivo Lectura / Escritura Sistema Operativo Apuntador a estruct. de archivo (alias)
Archivo
17
3.141592 3.141592
18
19
20
El archivo no existe
return
CLOSE (alias)
V V
Registro.no_prod = no_prod
Registro.no prod, Registro.descrip, Registro.cantidad, Registro.precio Registro.garantia
Fig. 9. Diagrama de flujo de rutina de consulta secuencial Ing. Bruno Lpez Takeyas , M.C.
21
22
Los archivos en Lenguaje C++ usan direcciones fsicas y no lgicas como en PASCAL.
Archivo: PRODUCTO.SEC
Dir. 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
23
24
El archivo no existe
return
Fig. 14. Diagrama de flujo de rutina de consulta directa Ing. Bruno Lpez Takeyas , M.C.
25
#include <stdio.h>
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;
26
27
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++
28
#include <stdio.h>
29
30
31
32
Puntos de referencia
Modo 0 1 2
Nombre
Operacin
SEEK_SET Desde el principio del archivo SEEK_CUR Desde la posicin actual del apuntador del archivo SEEK_END Desde el final del archivo Fig. 19. Puntos de referencia de la funcin fseek
33
2.2.6.2. Conociendo la posicin del apuntador del archivo con la funcin ftell()
Se usa la funcin ftell para conocer la posicin actual del apuntador de un archivo abierto. La posicin se expresa en bytes (direccin fsica) contados desde el principio del archivo (Fig. 21).
dir_fisica = ftell(alias);
La variable dir_fisica debe ser declarada como long int
34
rewind(alias);
La funcin rewind devuelve el apuntador del archivo al principio sin necesidad de la funcin fseek
35
Ntese que se necesitan dos \ ya que el backslash indica el inicio de una secuencia
rename(c:\\tarea\\VIEJO.OLD, c:\\tarea\\NUEVO.NEW);
36
Ntese que se necesitan dos \ ya que el backslash indica el inicio de una secuencia
remove(c:\\tarea\\VIEJO.OLD);
37
38
struct tipo_registro { int no_prod; char descrip[30]; int cantidad; float precio; char garantia; }; struct tipo_registro Registro; FILE *alias; void main(void) { . }
Declaracin del tipo de dato (en este caso del tipo de registro)
39
40
READ (Registro,alias)
V V
Registro.no_prod = no_prod
Registro duplicado
F READ (Registro,alias)
CLOSE (alias)
return
Fig. 26. Diagrama de flujo de rutina de alta secuencial Ing. Bruno Lpez Takeyas , M.C.
41
42
43
44
V alias= NULL F
El archivo no existe
return
Lectura del registro del archivo completo controlado por alias READ (Registro,alias) Ciclo mientras no se encuentre el final del archivo
Fin del listado
CLOSE (alias)
V
Registro.no prod, Registro.descrip, Registro.cantidad, Registro.precio Registro.garantia
READ (Registro,alias)
Fig. 29. Diagrama de flujo de rutina de listado secuencial Ing. Bruno Lpez Takeyas , M.C.
45
void LISTADO_SECUENCIAL(void) { clrscr(); cout << "\n\rLISTADO DE REGISTROS DE PRODUCTOS"; alias=fopen("PRODUCTO.SEC","rb"); // Intenta abrir el archivo PRODUCTO.SEC // en modo de solo lectura if(alias==NULL) { cout << "\n\n\n\rNo existe el archivo !!!"; cout << "\n\r<<< Oprima cualquier tecla para continuar >>>"; getch(); return; } cout << "\n\rNo Prod Descripcion Cantidad Precio Garantia"; cout << "\n\r-----------------------------------------------------------------------"; fread(&Registro,sizeof(Registro),1,alias); // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias" while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo { printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descr ip, Registro.cantidad,Registro.precio,Registro.garantia); fread(&Registro,sizeof(Registro),1,alias); } fclose(alias); // Cierra el archivo cout << "\n\r-----------------------------------------------------------------------"; cout << "\n\rFin del listado !!!"; cout << "\n\r<<< Oprima cualquier tecla para continuar >>>"; getch(); return;
46
47
MODIFICACION SECUENCIAL
El archivo no existe
return
CLOSE (alias)
V V
Registro.no_prod = no_prod
Registro.descrip, Registro.cantidad, Registro.precio Registro.garantia
F READ (Registro,alias)
WRITE (Registro,alias)
Fig. 31. Diagrama de flujo de rutina de modificacin secuencial Ing. Bruno Lpez Takeyas , M.C.
48
49
el
con
} fread(&Registro,sizeof(Registro),1,alias);
} cout << "\n\rNo se encuentra ese registro !!!"; fclose(alias); // Cierra el archivo cout << "\n\r<<< Oprima cualquier tecla para continuar >>>"; getch(); return; }
50
51
El archivo no existe
return
CLOSE (alias)
V V
Registro.no_prod = no_prod
Registro.no prod=0 Registro.descrip= Registro.cantidad=0 Registro.precio=0.0 Registro.garantia=
F READ (Registro,alias)
WRITE (Registro,alias)
Fig. 33. Diagrama de flujo de rutina de baja lgica secuencial Ing. Bruno Lpez Takeyas , M.C.
52
53
el
con
54
BAJA_FISICA_SECUENCIAL
El archivo no existe
return
READ (Registro,alias)
DELETE (PRODUCTO.SEC)
V V
Registro.no_prod <> 0
Fig. 35. Diagrama de flujo de rutina de baja fsica secuencial (compactar) Ing. Bruno Lpez Takeyas , M.C.
55
56
57
SEEK (dir_fisica,alias)
CLOSE (alias)
F
Registro.descrip, Registro.cantidad, Registro.precio Registro.garantia
WRITE (Registro,alias)
Registro.no_prod = no_prod
SEEK (dir_fisica,alias)
Fig. 37. Diagrama de flujo de rutina de altas directas Ing. Bruno Lpez Takeyas , M.C.
58
59
60
Apertura del archivo y asignacin del alias Valida la existencia del archivo
V
Registro.no_prod = no_prod
F
No existe ese registro
Fig. 39. Diagrama de flujo de rutina de consultas directas Ing. Bruno Lpez Takeyas , M.C.
61
62
63
MODIFICACION DIRECTA
El archivo no existe
return
dir fisica=no prod*sizeof(Registro) SEEK (dir_fisica,alias) READ (Registro,alias) Posicionar el apuntador del archivo Lectura del registro completo del archivo controlado por alias V
Registro.no_prod = no_prod
F
No existe ese registro SEEK (ftell(alias)sizeof(Registro) ,alias)
CLOSE (alias)
Fig. 41. Diagrama de flujo de rutina de modificacin directa Ing. Bruno Lpez Takeyas , M.C.
64
65
66
67
El archivo no existe
return
dir fisica=no prod*sizeof(Registro) SEEK (dir_fisica,alias) READ (Registro,alias) Lectura del registro del archivo completo controlado por alias V
Registro.no prod=0 Registro.descrip= Registro.cantidad=0 Registro.preci=0.0 Registro.garantia=
Registro.no_prod = no_prod
F
No existe ese registro SEEK (ftell(alias)sizeof(Registro) ,alias)
CLOSE (alias)
WRITE (Registro,alias)
Fig. 43. Diagrama de flujo de rutina de baja lgica directa Ing. Bruno Lpez Takeyas , M.C.
68
69
-> ";
op=toupper(getche()); }while(op!='S' && op!='N'); if(op=='S') { fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo fwrite(&Registro,sizeof(Registro),1,alias); // Graba el registro con // los nuevos campos cout << "\n\n\n\rRegistro eliminado logicamente !!!"; } else { cout << "\n\n\n\rRegistro NO eliminado !!!"; } fclose(alias); // Cierra el archivo cout << "\n\r<<< Oprima cualquier tecla para continuar >>>"; getch(); return; } else { cout << "\n\n\n\rNo se encuentra ese registro !!!"; } fclose(alias); // Cierra el archivo cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>"; getch(); return; }
70
4. CONCLUSIONES
Aunque existe una gran diversidad de aplicaciones que se pueden desarrollar con manejo de archivos que pueden ser sumamente completas y complejas, estos apuntes presentan, de una forma sencilla y comprensible, los aspectos bsicos de programacin de archivos usando lenguaje C++. De tal forma, que no presenta lgica abrumadora de control de detalles, sino la base fundamental del material es entender y utilizar las funciones bsicas de manejo de archivos en este lenguaje para posteriormente usarlas en el curso de Administracin de Archivos y en cursos posteriores. Cabe destacar que la codificacin de las rutinas que se muestran se pueden obtener en forma ntegra en el sitio http://www.itnuevolaredo.edu.mx/takeyas y ejecutarse para reafirmar el contenido.
71
5. BIBLIOGRAFIA
Garca Badell, J. Javier. "Turbo C. Programacin en manejo de archivos". Macrobit. Joyanes Aguilar, Luis. "Problemas de Metodologa de la Programacin". McGraw Hill. 1990. Lafore, Robert. Turbo C. Programming for the PC. Loomis, Mary E.S. Estructura de Datos y Organizacin de Archivos. Prentice Hall. Mxico. 1991. Martin, James. Organizacin de las bases de datos. Prentice Hall. 1993. Rose, Cesar E. Archivos. Organizacin y Procedimientos. Computec. 1993. Sedgewick, Robert. "Algorithms". Second edition. Addison Wesley. USA. 1988. Sedgewick, Robert. "Algoritmos en C++". Addison Wesley. USA. 1995. Tsai, Alice Y. H. "Sistemas de bases de datos. Administracin y uso". Prentice Hall. 1988.
72