Documentos de Académico
Documentos de Profesional
Documentos de Cultura
5 Almacenamiento Externo de Datos
5 Almacenamiento Externo de Datos
OBJETIVOS
Dar a conocer las diversas formas de almacenamiento externo
de datos en la computadora.
Dar las pautas necesarias para el tratamiento de archivos.
Proporcionar las diferentes estructuras Sintcticas de la
gramtica del lenguaje C en el manejo de Archivos.
METAS
El alumno obtendr habilidades en el manejo de Archivos
El alumno ser capas de resolver diferentes problemas sobre
la temtica con eficiencia y eficacia.
CAMPO DE APLICACION
Construccin de sistemas que manejen datos completos de
instituciones como ser, manejo de planillas de sueldos,
manejo de bibliotecas, listas de alumnos y notas,
recuperacin de grficos en sus diferentes formatos y otras
referente al manejo de volmenes de informacin.
SIS-1101
PAG. 1
DE 34
SIS-1101
PAG. 2
DE 34
DEFINICIN DE FICHERO
Conjunto de informacin relacionada, tratada como una unidad de almacenamiento
en memoria secundaria y organizada de forma estructurada para facilitar la
bsqueda de datos individuales.
Un fichero est compuesto por registros homogneos que contienen informacin
organizada en campos.
La idea ms comn del concepto de fichero es un
conjunto de posiciones de memoria situadas en un
disco
de
los
dispositivos
externos
de
almacenamiento del sistema, en las cuales
podemos almacenar y recuperar informacin.
SIS-1101
PAG. 3
DE 34
SIS-1101
PAG. 4
DE 34
Los ficheros de texto se caracterizan por estar compuestos por una serie de caracteres
organizados en lneas terminadas por un carcter de nueva lnea (carcter '\n'). Esto nos
hace pensar en la idea de usar la impresora como si fuese un fichero de texto.
Por otro lado, los ficheros binarios constan de una secuencia de bytes. Podemos decir
que cualquier fichero que no sea de texto, ser binario.
SIS-1101
PAG. 5
DE 34
SIS-1101
PAG. 6
DE 34
PAG. 7
DE 34
Nom_var_Fich
;
Nom_var_Fich
PAG. 8
DE 34
fopen
nombre
_fichero
modo
acceso
)
PAG. 9
;
DE 34
Significado
Abre un archivo de texto para solo lectura. Si el archivo no existe, devuelve un error
Abre el archivo de texto para solo escritura. Si el fichero no existe, lo crea, y si existe lo machaca.
Abre el archivo de texto para aadir al final. Si el fichero no existe, lo crea.
Abre el archivo de texto para lectura/escritura. Si el fichero no existe, da un error
Abre el archivo de texto para lectura/escritura. Si el fichero no existe, lo crea, y si existe lo machaca.
Abre el archivo de texto para aadir al final, con opcin de lectura. Si el fichero no existe, lo crea.
Abre un archivo binario para solo lectura. Si el archivo no existe, devuelve un error
Abre el archivo binario para solo escritura. Si el fichero no existe, lo crea, y si existe lo machaca.
Abre el archivo binario para aadir al final. Si el fichero no existe, lo crea.
Abre el archivo binario para lectura/escritura. Si el fichero no existe, da un error
Abre el archivo binario para lectura/escritura. Si el fichero no existe, lo crea, y si existe lo machaca.
Abre el archivo binario para aadir al final, con opcin de lectura. Si el fichero no existe, lo crea.
Decir que los ficheros de texto se pueden referenciar tambin como "rt", "wt", "at", "rt+",
"wt+" y "at+", pero para facilitar ms las cosas, cuando no especificamos si queremos abrir
un fichero de texto o binario, por defecto se supone que es de texto, es por ello que los
modos "r", "w" y "a" se refieren a ficheros de texto.
SIS-1101
PAG. 10
DE 34
Cuando terminemos de trabajar con un fichero hemos de realizar la operacin de cierre del
fichero. Si no lo hacemos podemos ocasionar la prdida de todos los datos del mismo.
Su diagrama de Sintaxis es el siguiente:
=
fclose
Variable_fichero
Valor
Si se necesitan cerrar varios ficheros a la vez, nos podemos ahorrar varios fclose utilizando
la funcion fcloseall.
fcloseall
<numero_ficheros> = fcloseall();
Donde:
numero_ficheros es una variable entera que indica el
nmero de ficheros cerrados, o EOF si ha ocurrido un error.
fcloseall
Valor
SIS-1101
PAG. 11
DE 34
carcter
c = 'G';
var fich
getc : Esta funcin lee un carcter de un fichero de texto abierto en modo lectura. Devuelve
un entero si la lectura es correcta. De otra forma devuelve el valor EOF que indica que
hemos llegado al final del fichero. Su formato es:
<carcter> = getc (<var_fich>);
Donde: carcter es la variable que contendr el carcter ledo del fichero.
var_fich es la variable declarada como FILE.
carcter
getc
var fich
PAG. 12
DE 34
#include <string.h>
#include <stdio.h>
#include <conio.h>
void carta(void);
void mostrar(void);
FILE *pf;
int main(void)
{
clrscr();
carta();
mostrar();
return 0;
}
void carta(void)
{
char ch;
pf = fopen("DATOS.DAT",
"w");
do
{ ch=getch();
putch(ch);
fputc(ch,pf);
}while(ch!='*');
fclose(pf);
}
void mostrar(void)
{
char ch;
pf = fopen("DATOS.DAT", "r");
do
{ ch = fgetc(pf);
putch(ch);
} while (ch != EOF);
fclose(pf);
}
SIS-1101
PAG. 13
DE 34
getw : Esta funcin devuelve un entero ledo de un fichero binario. Su sintaxis es:
<num_entero> = getw (<var_fich>);
Donde:
num_entero es la variable que contendr el valor entero ledo del fichero.
var_fich es la variable declarada como FILE.
=
Num_entero
getw
var fich
Ejemplos:
i = getw (fich);
printf ("%d\n", getw (fich));
putw
Esta funcin escribe un entero en un fichero binario. Su sintaxis es:
putw (<num_entero>, <var_fich>);
Donde:
num_entero es el valor entero que se escribir en el fichero.
var_fich es la variable declarada como FILE.
putw
Num_entero
var fich
Ejemplos:
putw (5, fich);
i = 99; putw (i, fich);
SIS-1101
PAG. 14
DE 34
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
FILE *pf;
int dato;
void crear(void);
void leer(void);
int main(void)
{
clrscr();
crear();
leer();
return 0;
}
SIS-1101
void crear(void)
{
pf = fopen("datos.dat", "wb");
do {
scanf("%i",&dato);
putw(dato,pf);
}while(dato!=0);
fclose(pf);
}
void leer(void)
{
pf = fopen("datos.dat", "rb");
while (!feof(pf))
{
dato = getw(pf);
printf("%i\t",dato);
}
fclose(pf);
}
ING. CARLOS BALDERRAMA V.
PAG. 15
DE 34
fputs : Esta funcin escribe una cadena de caracteres en un fichero de texto. Su formato es:
fputs (<cadena>, <var_fich>);
Donde:
cadena es el cadena que se desea escribir en el fichero.
var_fich es la variable declarada como FILE.
fputs
cadena
var fich
SIS-1101
cadena
Num caractere
var fich
PAG. 16
DE 34
#include<stdio.h>
#include<conio.h>
#include<string.h>
FILE *pf;
void crear(void);
void mostrar(void);
main()
{
clrscr();
crear();
mostrar();
return 0;
}
SIS-1101
void crear(void)
{ char nom[10];
printf("Para terminar <*>\n");
pf=fopen("datos.dat","w");
do {
gets(nom);
fputs(nom,pf);
} while (nom[0]!='*');
fclose(pf);
}
void mostrar(void)
{ char nom[10];
pf=fopen("datos.dat","r");
while (!feof(pf))
{
fgets(nom,10,pf);
printf("%s\n",nom);
}
fclose(pf);
}
PAG. 17
DE 34
fscanf : Esta funcin trabaja de la misma manera que scanf, pero leyendo los datos
formateados de un fichero. Su sintaxis es:
fscanf (<var_fich>, <cadena_de_control>, <lista_variables>);
Donde:
var_fich es la variable declarada como FILE.
cadena_de_control son las cadenas de control que se desean leer, %d, %s, %f, %x,
lista_variables son las variables que contendrn los valores de la lectura del fichero
que deben coincidir con sus respectivas cadenas de control.
fscanf
Ejemplos:
var fich
cad de control
lista variables
Ejemplos:
SIS-1101
var fich
cad de control
lista variables
PAG. 18
DE 34
#include<stdio.h>
#include<conio.h>
#include<string.h>
FILE *pf;
void crear(void);
void mostrar(void);
main()
{
clrscr();
crear();
mostrar();
return 0;
}
SIS-1101
void crear(void)
{ char nom[10];
printf("Para terminar <*>\n");
pf=fopen("datos.dat","w");
do {
gets(nom);
fprintf(pf,"%10s",nom);
} while (nom[0]!='*');
fclose(pf);
}
void mostrar(void)
{ char nom[10];
pf=fopen("datos.dat","r");
while (!feof(pf))
{
fscanf(pf,"%10s",nom);
printf("%s\n",nom);
}
fclose(pf);
}
ING. CARLOS BALDERRAMA V.
PAG. 19
DE 34
feof
var_fich
ferror
var_fich
Ejemplo:
fwrite (&dato, sizeof(dato), 1, fich);
if (ferror(fich)) printf ("Error de escritura\n");
SIS-1101
PAG. 20
DE 34
rewind : Esta funcin restablece el localizador de posicin del archivo al comienzo del
mismo. Su sintaxis es:
rewind (<var_fich>);
Donde:
var_fich es la variable declarada como FILE.
rewind
var_fich
Por ejemplo, si estamos leyendo secuencialmente el fichero fich y vamos por el cuarto dato,
al hacer rewind(fich), volveramos al principio del fichero y podramos volver a leer el
primer dato, como si lo abrisemos de nuevo para lectura.
SIS-1101
PAG. 21
DE 34
Las operaciones sobre un archivo de acceso aleatorio (Archivo con tipo) son las
siguientes:
1. Declaracin del archivo tipo texto.
2. Apertura del archivo en un modo especfico.
3. Tratamiento de los datos que tiene el archivo.
4. Cerrado del archivo.
La operaciones 1,2,4 son bsicamente las mismas que en los archivos secuenciales.
Supongamos que tenemos definido un fichero con la siguiente estructura de registro:
struct
{
int codigo;
char nomart[31];
float precio;
}articulo;
Es evidente que la longitud de cada registro es de 37 bytes (2+31+4 bytes). De esta forma,
la disposicin de los registros dentro del fichero en disco se realiza en las siguientes
posiciones:
SIS-1101
PAG. 22
DE 34
SIS-1101
fseek
var_fich
direccin
desde
PAG. 23
DE 34
ftell : nos devuelve la posicin en la que nos encontramos dentro del fichero
<posicin> = ftell (<var_fich>);
Donde:
posicin es la variable que contendr la posicin en bytes en la que nos
encontramos en ese momento en el fichero.
var_fich es la variable declarada como FILE.
posicin
ftell
var_fich
Esta funcin se suele usar, a parte de para saber la situacin exacta en el fichero, para
obtener la longitud del mismo. Veamos un ejemplo:
...
if ((f=fopen("articul.dat", "rb")) == NULL)
{
printf ("Imposible crear fichero\n");
exit (1);
}
fseek (f, 0, 2); /* tambien puede ser fseek (f, 2, SEEK_END); */
l = ftell(f);
printf ("El fichero tiene un tamao de %ld bytes\n", l);
printf ("Y un total de %ld registros\n", l/sizeof(reg));
/* donde reg sera la estructura o el dato simple contenido en el fichero */
...
SIS-1101
PAG. 24
DE 34
fsetpos
puntero_del_fichero
posicion
La funcin fsetpos devuelve cero si no ocurre un error y un valor distinto a cero, en caso
contrario.
fgetpos : Esta funcin devuelve la posicin de un determinado registro en el archivo.
fgetpos ( <puntero_fichero>,<posicin>);
Donde :
puntero_del_fichero
posicion
La funcin fgetpos devuelve cero si no ocurre un error y un valor distinto de cero, en caso
contrario.
SIS-1101
PAG. 25
DE 34
fwrite : Esta funcin permite escribir uno o ms datos o bloques de datos binarios en un
fichero. Su formato es el siguiente:
fwrite (<dato>, <num_bytes>, <cont>, <var_fich>);
Donde:
dato es el dato o datos que se van a escribir en el fichero. Hemos de
especificar su direccin de memoria mediante el operador "&".
num_bytes es el nmero de bytes que se van a escribir. Lo ms corriente es
usar para este argumento el operador sizeof sobre el dato a escribir.
cont es el nmero de datos, de num_bytes cada uno que se van a escribir.
var_fich es el puntero al fichero binario usado.
fwrite
,
,
,
)
;
num bytes
Dato
cont
Var fich
fread : Esta funcin permite leer uno o ms datos o bloques de datos de un fichero binario.
Su formato es:
fread (<dato>, <num_bytes>, <cont>, <var_fich>);
Donde:
dato es la variable donde se guardarn los datos ledos del fichero. Hemos de
indicar su direccin por tratarse de un puntero.
num_bytes es el nmero de bytes que se van a leer del fichero. Lo ms
corriente es usar para este argumento el operador sizeof.
cont es el nmero de datos, de num_bytes cada uno que se van a leer.
var_fich es el puntero al fichero binario usado.
fwrite
SIS-1101
Dato
num bytes
cont
Var fich
PAG. 26
DE 34
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
struct empleado {
char nom[10],app[10],apm[10];
int edad,fono;
float esta;
} emp;
FILE *pf;
void leeremp(void);
void mostraremp(void);
void crear(void);
void mostrar(void);
void truco(void);
main()
{ clrscr();
truco();
crear();
mostrar();
return 0;
}
SIS-1101
void leeremp(void)
{
clrscr();
printf("Nombre = ");
gets(emp.nom);
printf("Ap. Paterno = ");
gets(emp.app);
printf("Ap. Materno = ");
gets(emp.apm);
printf("Edad = ");
scanf("%d",&emp.edad);
printf("Telefono = ");
scanf("%d",&emp.fono);
printf("Estatura = ");
scanf("%f%*c",&emp.esta);
}
PAG. 27
DE 34
void crear(void)
void mostraremp(void)
{ char op;
{
pf=fopen("datos.dat","w");
clrscr();
do {
printf("Nombre = %s\n",emp.nom);
leeremp();
printf("Ap. Paterno = %s\n",emp.app);
fwrite(&emp,sizeof(struct empleado),1,pf);
printf("Ap. Materno = %s\n",emp.apm);
printf("\n\nMas datos <s/n>");
printf("Edad = %d\n",emp.edad);
scanf("%c%*c",&op);
printf("Telefono = %d\n",emp.fono);
} while (tolower(op)!='n');
printf("esta = %f\n",emp.esta);
fclose(pf);
getch();
}
}
SIS-1101
void mostrar(void)
{ char nom[10];
pf=fopen("datos.dat","r");
while (!feof(pf))
{
fread(&emp,sizeof(struct empleado),1,pf);
mostraremp();
}
fclose(pf);
}
PAG. 28
DE 34
SIS-1101
PAG. 29
DE 34
#include<stdio.h>
#include<string.h>
void creadic(void)
#include<conio.h>
{
struct dicc{
int op;
char palabra[10],signif[50];
dicio=fopen("diciona.dat","w");
}pal;
do {
FILE *dicio;
printf("\npalabra ");
FILE *cart;
gets(pal.palabra);
int error=0,buenas=0;
printf("significado ");
void creadic(void);
gets(pal.signif);
void creacarta(void);
fwrite(&pal, sizeof(pal),1,dicio);
void buscar(char ccc[10]):
printf("Mas datos s/n ");
void corregir(void)
op=getch();
main()
}while(op!='n');
{/* creadic();
fclose(dicio);
clrscr(); creacarta();*/
}
clrscr();
corregir();
clrscr();
printf("Palabras Correctas %d\n",buenas);
printf("Palabras Incorrectas %d\n",error);
getch();
return 0;
}
SIS-1101
PAG. 30
DE 34
void corregir(void)
{
char c=' ';
char palabra[20]="",aux[20];
cart=fopen("carta.dat","r");
while (!feof(cart))
{
c=fgetc(cart);
if (c!= ' ' && c!='\n')
{ strcpy(aux,palabra);
sprintf(palabra, "%s%c",aux,c);
}
else
{ if(buscar(palabra)==1) error++;
else buenas ++;
strcpy(palabra,"");
}
}
fclose(cart);
}
PAG. 31
DE 34
valor
valor
rename
nombre_actual
nuevo_nombre
PAG. 32
DE 34
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
void leer_archi(char *nombre);
void main(void)
{
int driver,modo;
detectgraph(&driver,&modo);
initgraph(&driver,&modo,"e:\\borlandc\\bgi");
leer_archi("splash.bmp");
getch();
closegraph();
}
SIS-1101
PAG. 33
DE 34
PAG. 34
DE 34