archivos - utmmgarcia/pe13(archivos).pdf · por ejemplo: remove(“a:archivo1.txt”); indica que...
Post on 04-Jul-2020
3 Views
Preview:
TRANSCRIPT
1
Archivos
SESION 13
Mónica E. García
ConceptosDefinición
Un archivo es una secuencia de bits almacenados en algúndispositivo externo tal como un disco o una cinta magnética.
En C un archivo es simplemente un flujo(stream) externo:una secuencia de bytes almacenados en disco.
Tipos de Archivos
Por la forma de almacenamiento de los datos: de texto ybinarios
Por la forma de acceso : secuenciales y directos
2
Mónica E. García
Tipos de ArchivosLos archivos de texto almacenan datos como códigos ASCII.Los valores simples, como números y caracteres únicos,están separados por espacios. Se pueden utilizar paraalmacenamiento de datos o crear imágenes de salidaimpresa que se pueden enviar más tarde a una impresora.
Los archivos binarios almacenan flujos de bits, sin prestaratención a los código ASCII o a la separación de espacios.Son adecuados para almacenar objetos. El uso de estosarchivos requiere usar la dirección de una posición dealmacenamiento
Mónica E. García
CreaciónLa declaración de una variable de tipo archivo es comosigue:
FILE *variable;
donde FILE es un tipo de estructura que establece el áreade buffer para un archivo. un área de buffer, donde lainformación se almacena temporalmente mientras se estátransfiriendo entre la memoria y el archivo de datos. Lavariable tipo apuntador variable indica el inicio de estaárea. El tipo FILE está definido en la librería stdio.h.
3
Mónica E. García
Para trabajar con un archivo
Se necesitan seguir los siguientes pasos:
Abrir el archivo. En la apertura se debe de indicarel modo(Escritura,Lectura..) y la ruta del archivo.
Realizar las operaciones de Escritura y lectura enel archivo
Cerrar el archivo
Mónica E. García
Operaciones para archivos
Las distintas operaciones que sepueden realizar son:
Creación Consulta Actualización (modificación, altas,bajas) Clasificación y reorganziación Destrucción (borrado) Unión (de dos o mas contenidos de archivos)
4
Archivos de Texto
Archivos de acceso secuencial
Mónica E. García
Archivos de acceso secuencial
En este tipo de acceso, todos los registros son almacenadossecuencialmente en el medio de almacenamiento. A esto se lellama organización física secuencial. La secuencia física deregistros es usualmente ordenada de acuerdo a una claveprimaria.
El manejo secuencial de un archivo es recomendable cuando sedeben procesar todos o la mayoría de los registros, como porejemplo en los casos de una nómina de empleados o en laelaboración de reportes contables, ya en aplicaciones donde eltiempo real son importantes este acceso es ineficientes.
5
Mónica E. García
Archivos de texto
Los archivos de texto son un caso particular dearchivos secuenciales.
Estos archivos contienen caracteres consecutivos,los cuales se pueden interpretar como datosindividuales, como componentes de una cadena ocomo números.
Mónica E. García
Apertura de un archivo (fopen)
var=fopen (nombre_archivo,tipo_apertura);
donde nombre_archivo y tipo_apertura son variables detipo cadena. La variable var es de tipo archivo (FILE).
La función fopen retorna un apuntador al principio delárea de buffer asociada con el archivo. Se retorna unvalor NULL si no se puede abrir el archivo
6
Mónica E. García
Modos de aperturaLos tipos o modos de archivo son:
"r": Abrir un archivo existente sólo para lectura. "w": Abrir un nuevo archivo sólo para escritura. Si ya
existe, será destruido y creado uno nuevo (sobreescritura). "a": Abrir un archivo para añadir. Si no existe, se crea uno
nuevo. "r+": Abrir un archivo existente para lectura y escritura. "w+": Abrir un archivo nuevo para lectura y escritura. Si
ya existe, será destruido y creado uno nuevo. "a+": Abrir un archivo existente para leer y añadir. Si no
existe, se crea uno nuevo.
Mónica E. García
Ejemplo FILE *archi; char ruta[15]=“a:Prueba.txt”, acceso[2]=“a+”;..... archi = fopen(ruta,acceso); if (archi == 0)
printf(“Creacion y apertura exitosa”);
O BIEN : FILE *archi; ..... archi = fopen(“a:Archivosprueba.txt”,”a+”); if (archi != 0)
printf(“ERROR en la creación del archivo”); else
printf(“Creacion y apertura exitosa”);
7
Mónica E. García
Almacenamiento de datosfprintf (apunta_archi,”formatos”,Var1,Var2,..);
Ejemplo:fprintf(ptr,”%d %f”,x,y);
Donde: FILE *ptr; int x; float y;
Variable tipoapuntador aarchivo Se colocan tantos tipos de
formatos como variablessean, es importante el orden.
Nombre de lasvariables queseránalmacenadas,deben irseparadas porcomas.
Mónica E. García
Ejemplo de almacenamientoSuponerstruct registro{ int ncontrol; char nombre[15]; int edad; char sexo;}alumno;FILE *arch;
// Se realiza la lectura printf("\n Dar numero de control: ");
scanf("%d",&alumno.ncontrol); fflush(stdin); printf("\n Dar sólo el nombre : "); gets(alumno.nombre); printf("\n Dar edad: "); scanf("%d",&alumno.edad); fflush(stdin); printf("\n Sexo [F/M]: "); scanf("%c",&alumno.sexo);
// Se almacenan los datos en el archivofprintf(arch,"\n %d %s %d %c",alumno.ncontrol,alumno.nombre,alumno.edad,alumno.sexo);
8
Mónica E. García
Cerrar un archivo
Lo que se logra al cerrar un archivo esterminar el acceso o detener el uso delarchivo. Para esto se hace uso de la funciónfclose.
fclose(apunt_archi);
Mónica E. García
Obtención de datos del archivo
fscanf (apunta_archi,”formatos”,&Var1,&Var2,…);
Ejemplo:fscanf(ptr,”%d %f”,&x,y);
Donde: FILE *ptr; int x;
char y[5];
Variable tipoapuntador aarchivo Se colocan tantos tipos de
formatos como variablessean, es importante el orden.
Nombre de lasvariables queseránalmacenadas,deben irseparadas porcomas.El & no siempre seusa para variablestipo char
9
Mónica E. García
Acceso al archivo Función feof
Sirve para detectar una condición de fin de archivo (gralmente. usadaara archivos secuenciales). Esta función devuelve un valor distinto decero si detecta una condición de fin de archivo y un valor cero (falso) sino se detecta.
Generalmente se usa con el ciclo de repetición while.
Ejemplo: while (!feof(apunta_archi)) { Acciones
}
Mónica E. García
Ejemploprintf("\n\t***** SALIDA DE DATOS DESDE EL ARCHIVO ******** \n"); printf("\n\t __NUMERO___NOMBRE___EDAD____SEXO__\n ");
//Uso del ciclo while
while(!feof(arch)) //equivale a x=feof(arch); while(x!=0) { .....} { // Se obtienen los datos en el archivo fscanf(arch," %d %s %d %c",&alumno.ncontrol,&alumno.ncompleto,&alumno.edad,&alumno.sexo); printf(" %d %s %d %c\n",alumno.ncontrol,alumno.ncompleto,alumno.edad,alumno.sexo); }
//Se cierra el archivo fclose(arch);
10
Mónica E. García
Funciones paraactualizar-modificar archivos
La función remove elimina todos los elementosreferidos en él.
Por ejemplo: remove(“a:Archivo1.txt”);
indica que se “eliminará” toda informaciónrelacionada con ese archivo. Esta eliminación es untipo de inlink (no enlace).
Si la función remove se logra con éxito seretronará un valor de 0 de lo contrario un –1.
Mónica E. García
Funciones paraactualizar-modificar archivos
La función rename nombra un archivo con unnombre diferente, la ruta del nuevo archivo puedeser otra.
Ejemplo:rename(“a:viejo.txt”.”a:nuevo.txt”);
Si la función rename se logra con éxito seretronará un valor de 0 de lo contrario un –1.
11
Mónica E. García
Ejemplo de actualizaciónvoid actualizar()
{ int x;
printf("\n\t\t ******* BAJAS ***********");
if ((apun1=fopen("a:original.txt","r"))!=NULL &&
(apun2=fopen("a:auxiliar.txt","w"))!=NULL )
{
printf("\n Dar el dia para dar de baja la fecha ");
scanf("%d",&x);
while(!feof(apun1))
{
fscanf(apun1,"%d %s %d",&dia,&mes,&ann); if (x!= dia)
{
fprintf(apun2,"\n %d %s %d",dia, mes, ann);
}
}
fclose(apun1);
fclose(apun2);
remove("a:original.txt"); rename("a:auxiliar.txt","a:original.txt"); } }
Mónica E. García
Otras funciones para datos char
Para extraer del archivo Carácter fgetc Cadena fgets
Para almacenar en el archivo Carácter fputc Cadena fputs
12
Mónica E. García
Otras funciones ...
fgets(cadena2,strlen(cadena1)+1,apunta_archi);fgets lee carácter por carácter de un archivo hasta n-1o hasta que se encuentra una nueva línea(\n).
fputs(cadena,apunta_archi);Copia una cadena –con espacios- a un archivo, nocopia el carácter nulo (\0).
Archivos binarios
Archivos de acceso directo
13
Mónica E. García
Acceso Directo Los registros individuales de un archivo de acceso
directo normalmente son de longitud fija y se puedetener acceso a ellos directamente.
Este tipo de archivos son adecuados paratransacciones que requieren de acceso rápido a datosespecíficos.
Los datos pueden agregarse , ser actualizados obarrados sin tener que reescribir todo el archivo.
Mónica E. García
Archivos binarios
Los archivos binarios almacenan flujos de bits sinprestar atención a los códigos ASCII o a la separaciónde espacios. Son adecuados para almacenar objetos.Sin embargo, el uso de los archivos binarios requiereusar la dirección de una posición de almacenamiento.
14
Mónica E. García
Funciones de acceso directo
fwrite(buffer,n,c,pf); Esta función escribe hasta c elementos delongitud n bytes, almacenados en el buffer, en el archivoapuntado por pf.
fread (buffer,n,c,pf); Esta función lee hasta c elementos delongitud n bytes, del archivo apuntado por pf y los almacena enel buffer. Devuelve el número de elementos leídos.
La longitud n se obtiene con la funcion sizeof(variable);
Mónica E. García
.. Funciones fseek(pf,desp,pos); Esta función mueve el apuntador de L/E
(Lectura-Escritura) asociado con el archivo apuntado por pf auna nueva localidad desplazada por desp bytes de la posicióndada por pos.Las opciones de pos pueden ser :
SEEK_SET Principio del archivoSEEK_CUR Posición actual del apunatdor de L/ESEEK_END Final del archivo
rewind(pf); Realiza la misma tarea que fseek con la opciónSEEK_SET. Es decir que coloca el apuntador de tipo archivo alinicio de éste.
15
Mónica E. García
Ejemplo de escriturachar op;
if ((apun1=fopen("a:binario1.txt","ab"))==NULL) { printf("No se pudo leer el archivo"); getch(); } else { do { printf("\nDia__ ");scanf("%d",&fecha.dia); printf("\nMes__ ");scanf("%s",&fecha.mes); printf("\nAño__ ");scanf("%d",&fecha.ann); fwrite(&fecha,sizeof(struct dat),1,apun1); printf("\n\t Dar otra fecha"); fflush(stdin); scanf("%c",&op); //op=getch(); clrscr(); }while(op=='s' || op == 'S'); fclose(apun1);
Sea:
struct dat{ int dia,ann; char mes[15];}fecha;
FILE *apun1
Mónica E. García
Ejemplo de lecturaint i; if ((apun1=fopen("a:binario1.txt","rb"))==NULL) { printf("No se pudo leer el archivo"); getch(); } else { clrscr(); printf("\n\t ******** SALIDA DE DATOS ******** "); //while(!feof(apun1)) while (fread(&fecha,sizeof(struct dat),1,apun1)== 1) { //fread(&fecha,sizeof(struct dat),1,apun1); printf("\n\n\tDia %d",fecha.dia); printf("\n \tMes %s",fecha.mes); printf("\n \tAño %d",fecha.ann); } getch(); fclose(apun1); }
top related