Fecha de efectividad: _______________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
CARRERA
LSC
PLAN DE ESTUDIO
2003-1
CLAVE ASIGNATURA
5221
NOMBRE DE LA ASIGNATURA
L !"#$% & P'("'$)$*+,! E-.'#*.#'$&$
PR/CTICA N(0
LABORATORIO DE NOMBRE DE LA PR/CTICA
L+* !*+$&( ! S+-. )$- C()1#.$*+(!$2 -
DURACIN (3ORA)
9
A'*5+6(- & T 7.( 8 B+!$'+(-
10 INTRODUCCIN
El almacenamiento de datos en variables y en arreglos es temporal, al terminar un programa todos los datos se pierden, para la conservacion permanente de grandes cantidades de datos se utilizan los archivos en dispositivos de almacenamiento secundario, especialmente en dispositivos de almacenamiento en disco.
20 OBJETIVO (COMPETENCIA)
El alumno aplicar el uso de archivos para el manejo de informacin en un dispositivo secundario
30 FUNDAMENTO
ara entrar en materia vamos a analizar un ejemplo !ue lee un archivo de te"to y lo muestra en la pantalla: #include <stdio.h> int main() { FILE *archivo; char letra; archivo = fopen("[Link]","r"); if (archivo==NULL) { printf( "No se puede abrir el archivo." ); exit( 1 ); } printf( "Contenido del archivo:" ); letra=getc(archivo); while (feof(archivo)==0) {
Formul
#evis
$prob
$utoriz
L0I0 3+2&$ O2+6+$ A2:$'';! P$&+22$ I!"0 E6$ 3 '' '$ R$)<' = I!"0 G0 A!">2+*$ F2(' - R+6 '$
%aestro
L0S0C0 M,!+*$ C'+-.+!$ L$) M('$
M0C0 M+"# 2 /!" 2 M$'.<! = R() '(
&oordinador de rograma Educativo
'estin de &alidad
(irector de la Facultad
&digo '&)*+),-. #evisin -
gina 1
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
printf( "%c",letra ); letra=getc(archivo); } if (fclose(archivo)!=0) printf( "Problemas al cerrar el archivo" ); } EL PUNTERO FILE /odas las funciones de estrada0salida estndar usan este puntero para conseguir informacin sobre el archivo abierto. Este puntero no apunta al archivo sino a una estructura !ue contiene informacin sobre 1l. Esta estructura incluye entre otras cosas informacin sobre el nombre del archivo, la direccin de la zona de memoria donde se almacena el archivo, tama2o del buffer. ABRIR EL ARC3IVO0-$hora vamos abrir el archivo. ara ello usamos la funcin fopen. FILE *fopen(const char *nombre_archivo, const char *modo); El nombre de archivo se puede indicar directamente 3como en el ejemplo4 o usando una variable. El archivo se puede abrir de diversas formas. Esto se especifica con el parmetro modo. 5os modos posibles son: r $bre un archivo e"istente para lectura. 6 &rea un archivo nuevo 3o borra su contenido si e"iste4 y lo abre para escritura. a $bre un archivo 3si no e"iste lo crea4 para escritura. El puntero se sit7a al final del archivo, de forma !ue se puedan agregar datos si borrar los e"istentes. 8e pueden a2adir una serie de modificadores siguiendo a los modos anteriores: b $bre el archivo en modo binario. t $bre el archivo en modo te"to. 9 $bre el archivo para lectura y escritura. Ejemplos de combinaciones: rb9 $bre el archivo en modo binario para lectura y escritura. 69 &rea 3o lo borra si e"iste4 un archivo para lectura y escritura. rt $bre un archivo e"istente en modo te"to para lectura. :na cosa muy importante despu1s de abrir un archivo es comprobar si realmente est abierto. El sistema no es infalible y pueden producirse fallos: el archivo puede no e"istir, estar danado o no tener permisos de lectura. 8i intentamos realizar operaciones sobre un puntero tipo F;5E cuando no se ha conseguido abrir el archivo puede haber problemas. or eso es importante comprobar si se ha abierto con 1"ito. 8i el archivo no se ha abierto el puntero archivo 3puntero a F;5E4 tendr el valor *:55, si se ha abierto con 1"ito tendr un valor distinto de *:55. or lo tanto para comprobar si ha habido errores nos fijamos en el valor del puntero: if (archivo==NULL) { printf( "No se puede abrir el archivo." ); exit( 1 ); } !bloc"#uote$ 8i archivo<<*:55 significa !ue no se ha podido abrir por algun error. 5ectura del archivo " .* lee los caracteres uno a uno. ?" .- lee l=neas completas desde un archivo &uando entramos en el ciclo 6hile, la lectura se realiza hasta !ue se encuentre el final del archivo. &digo '&)*+),-. #evisin gina 2
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
ara detectar el final del archivo se pueden usar dos formas: con la funcin ? (?() comprobando si el valor de letra es EOF. En el ejemplo hemos usado la funcin feof. Esta funcin comprueba si se ha llegado al final de archivo en cuyo caso devuelve un valor distinto de ,. 8i no se ha llegado al final de archivo devuelve un cero. or eso lo usamos.&uando trabajamos con archivos de te"to no hay ning7n problema, pero si estamos manejando un archivo binario podemos encontrarnos E>F antes del fin de archivo. or eso es mejor usar feof. :na vez realizadas todas las operaciones deseadas sobre el archivo hay !ue cerrarlo. Es importante no olvidar este paso pues el archivo podr=a corromperse. $l cerrarlo se vacian los buffers y se guarda el archivo en disco. :n archivo se cierra mediante la funcin ?*2(- 3fichero4. 8i todo va bien fclose devuelve un cero, si hay problemas devuelve otro valor. Estos problemas se pueden producir si el disco esta lleno.
?include @[Link] int main3 4 B F;5E CficheroD char te"toE-,,FD fichero<fopen3Gorigen.t"tG,GrG4D if 3fichero<<*:554 B printf3 G*o se puede abrir el archivo.G 4D e"it3 - 4D H printf3 G&ontenido del archivo:G 4D fgets3te"to,-,,,fichero4D 6hile 3feof3fichero4<<,4 B printf3 GIsG,te"to 4D fgets3te"to,-,,,fichero4D H if 3fclose3fichero4J<,4 printf3 G roblemas al cerrar el archivoG 4D H
E8&#;/:#$ (E :* $#&K;L> El siguiente paso, como antes, es abrir el archivo usando fopen. 5a diferencia es !ue ahora tenemos !ue abrirlo para escritura. :samos el modo: 6 3crea el archivo o lo vac;a si e"iste4 por!ue !ueremos crear un archivo. #ecordemos !ue despues de abrir un archivo hay !ue comprobar si la operacion se ha realizado con e"ito. Funciones de escritura: 1#.* escribe un caracter en el archivo ?1#.- escribe una cadena en el archivo EME% 5>: %include stdio.h$ int &ain() { '(L) *ori+en, *destino; char letra; ori+en=fopen("ori+[Link]","r"); destino=fopen("[Link]","-"); if (ori+en==NULL .. destino==NULL) { &digo '&)*+),-. #evisin gina 3
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
printf( "/roble&as con los archivos." ); exit( 1 ); } letra=+etc(ori+en); -hile (feof(ori+en)==0) { putc(letra,destino); printf( "1c",letra ); letra=+etc(ori+en); } if (fclose(ori+en)2=0) printf( "/roble&as al cerrar el archivo ori+[Link]" ); if (fclose(destino)2=0) printf( "/roble&as al cerrar el archivo [Link]" ); } *unca debemos olvidar al trabajar con archivos: cerrarlos. (ebemos cerrar tanto los archivos !ue leemos como a!uellos sobre los !ue escribimos. 5as funciones !ue hemos visto hasta ahora 3getc, putc, fgets, fputs4 son adecuadas para trabajar con caracteres 3byte4 y cadenas. ero, N!ue sucede cuando !ueremos trabajar con otros tipos de datosO 8upongamos !ue !ueremos almacenar variables de tipo int en un archivo.&omo las funciones vistas hasta ahora solo pueden operar con cadenas deberiamos convertir los valores a cadenas 3con la funcin itoa4. ara recuperar luego estos valores deberiamos leerlos como cadenas y pasarlos a enteros 3atoi4. Lamos a utilizar las funciones fread y f6rite. Estas funciones nos permiten tratar con datos de cual!uier tipo, incluso con estructuras. ?@'+. *os permite escribir en un archivo. Esta funcion tiene el siguiente formato: size_t fwrite(void *buffer, size_t tamano, size_t numero, FILE *pfichero); buffer ) variable !ue contiene los datos !ue vamos a escribir en el archivo. ta&a3o ) el tama2o del tipo de dato a escribir. uede ser un int, un float, una estructura, ... ara conocer su tama2o usamos el operador si4eof. n5&ero ) el numero de datos a escribir. pfichero ) El puntero al archivo sobre el !ue trabajamos. ara !ue !uede mas claro e"aminemos el siguiente ejemplo: rograma de una agenda personal !ue guarda el nombre, apellido y tel1fono de cada persona.
%include stdio.h$ struct { char no&bre6708; char apellido6708; char telefono6198; } re+istro; int &ain() { '(L) *fichero; fichero = fopen( "no&[Link]", "a" ); do { printf( "No&bre: " ); fflush(stdout); +ets(re+[Link]&bre); if (strc&p(re+[Link]&bre,"")) {
&digo '&)*+),-. #evisin gina 4
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
printf( ";pellido: " ); fflush(stdout); +ets(re+[Link]); printf( "<el=fono: " ); fflush(stdout); +ets(re+[Link]); f-rite( >istro, si4eof(re+istro), 1, fichero ); } } -hile (strc&p(re+[Link]&bre,"")2=0); fclose( fichero ); }
*>/$: El ciclo termina cuando el nombre se deja en blanco. Este programa guarda los datos personales mediante f6rite usando la estructura registro. $brimos el archivo en modo a 3append, a2adir4, para !ue los datos !ue introducimos se a2adan al final del archivo. :na vez abierto abrimos estramos en un bucle do)6hile mediante el cual introducimos los datos. 5os datos se van almacenando en la variable registro 3!ue es una estructura4. :na vez tenemos todos los datos de la persona los metemos en el archivo con f6rite: fwrite( istro, sizeof(registro), , fichero ); re+istro ) es la variable 3en este caso una estructura4 !ue contiene la informacion a meter al archivo. si4eof3registro4 ) lo utillizamos para saber cul es el n7mero de bytes !ue vamos a guardar, el tama2o en bytes !ue ocupa la estructura. 1 ) indica !ue slo vamos a guardar un elemento. &ada vez !ue se recorre el bucle guardamos slo un elemento. fichero ) el puntero F;5E al archivo donde vamos a escribir. fread 5a funcion fread se utiliza para sacar informacin de un archivo. 8u formato es: size_t fread(void *buffer, size_t tamano, size_t numero, FILE *pfichero); 8iendo buffer la variable donde se van a escribir los datos le=dos del archivo pfichero. El valor !ue devuelve la funcion indica el n7mero de elementos de tama2o tamano !ue ha conseguido leer. *osotros podemos pedirle a fread !ue lea -, elementos 3numero<-,4, pero si en el archivo slo hay P elementos fread devolver el n7mero P. 8iguiendo con el ejemplo anterior ahora vamos a leer los datos !ue hab=amos introducido en !():' -0.7..
include% stdio.h$ struct { char no&bre6708; char apellido6708; char telefono6198; } re+istro; int &ain() { '(L) *fichero; fichero = fopen( "no&[Link]", "r" ); -hile (2feof(fichero)) { if (fread( re+istro, si4eof(re+istro), 1, fichero )) { printf("No&bre: 1s", re+[Link]&bre ); printf(";pellido: 1s", re+[Link]); printf("<el=fono: 1s", re+[Link]); } } fclose( fichero ); }
5a funcin fread lee un registro 3numero<-4 del tama2o de la estructura registro.
&digo '&)*+),-. #evisin gina 5
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
8i realmente ha conseguido leer un registro la funcin devolver un -, en cuyo caso la condicin del +? ser verdadera y se imprimir el registro en la pantalla. En caso de !ue no !ueden ms registros en el archivo, fread devolver , y no se mostrar nada en la pantalla. fsee! " fte## fsee! 5a funcin fseeQ nos permite situarnos en la posicin !ue !ueramos de un archivo abierto. &uando leemos un archivo hay un puntero !ue indica en !u1 lugar del archivo nos encontramos. &ada vez !ue leemos datos del archivo este puntero se desplaza. &on la funcin fseeQ podemos situar este puntero en el lugar !ue deseado. El formato de fseeQ es el siguiente: int fsee!(FILE *pfichero, #ong desp#azamiento, int modo); &omo siempre pfichero es un puntero de tipo F;5E !ue apunta al archivo con el !ue !ueremos trabajar. despla4a&iento son las posiciones 3o bytes4 !ue !ueremos desplazar el puntero. Este desplazamiento puede ser de tres tipos dependiendo del valor de modo: SEEABSET El puntero se desplaza desde el principio del archivo. SEEABCUR El puntero se desplaza desde la posicin actual del archivo. SEEABEND El puntero se desplaza desde el final del archivo. 8i se produce alg7n error al intentar posicionar el puntero, la funcion devuelve un valor distinto de ,. 8i todo ha ido bien el valor devuelto es un ,. En el siguiente ejemplo se muestra el funcionamiento de fseeQ. 8e trata de un programa !ue lee la letra !ue hay en la posicin !ue especifica el usuario.
?include @[Link] int main34 B F;5E CficheroD long posicionD int resultadoD fichero < fopen3 Gorigen.t"tG, GrG 4D printf3 GNRu1 posicin !uieres leerO G 4D fflush3stdout4D scanf3 GI(G, Sposicion 4D resultado < fseeQ3 fichero, posicion, 8EET_8E/ 4D if 3Jresultado4 printf3 GEn la posicin I( est la letra Ic.G, posicion, getc3fichero4 4D else printf3 G roblemas posicionando el cursor.G 4D fclose3 fichero 4D H
?. 22 Esta funcin es complementaria a fseeQ, devuelve la posicin actual dentro del archivo. 8u formato es el siguiente: long ftell3F;5E Cpfichero4D El valor !ue nos da ftell puede ser usado por fseeQ para volver a la posicin actual. ?1'+!.? 8 ?-*$!? Estas dos funciones trabajan igual !ue sus e!uivalentes printf y scanf. 5a 7nica diferencia es !ue podemos especificar el archivo sobre el !ue operar 3si se desea puede ser la pantalla para fprintf o el teclado para fscanf4. 5os formatos de estas dos funciones son: int fprintf3F;5E Cpfichero, const char Cformato, ...4D int fscanf3F;5E Cpfichero, const char Cformato, ...4D
&digo '&)*+),-. #evisin gina 6
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
90 PROCEDIMIENTO (DESCRIPCIN) A) ECUIPO NECESARIO
&omputadora con 5inu" instalado rctica impresa
MATERIAL DE APODO
B)
DESARROLLO DE LA PR/CTICA
El desarrollo de esta prctica ser la elaboracin de los ejercicios realizados en la 1';*.+*$ !(0 E 3 referente a arreglos de estructuras4, es decir, !ue la prctica !ue le haya correspondido se har con archivos binarios.
&digo '&)*+),-. #evisin gina 7
de 8
Fecha de efectividad: ______________________
UNIVERSIDAD AUTNOMA DE BAJA CALIFORNIA FACULTAD DE INGENIERA (UNIDAD MEXICALI) DOCUMENTO DEL SISTEMA DE CALIDAD
Formatos para prcticas de laboratorio
C) 50 RESULTADOS D CONCLUSIONES
C/LCULOS D REPORTE
El maestro evaluar de manera individual sobre el funcionamiento de archivos.
$l finalizar esta practica el alumno podr utilizar $rchivos de manera eficiente
F0 ANEXOS
#eferencia a archivos
E0 REFERENCIAS
&digo '&)*+),-. #evisin gina 8
de 8