Está en la página 1de 18

Archivos y Bancos de Datos

Flujo de datos
 Es una abstracción del camino que siguen
los datos desde alguna fuente (dispositivos
de entrada o el programa) hasta un destino
(el programa o dispositivos de salida)
[Joyanes y Zahonero]
 A la fuente se le llama productor, al destino
se le llama consumidor
 Esta abstracción es usada en varios
lenguajes de programación, incluyendo el
lenguaje C
Flujo de datos en C

FILE *archivo // flujo de datos

Flujo de datos

20/02/12 Programación avanzada y métodos numéricos 3


Flujos abiertos por defecto en stdio.h
FILE *stdin // entrada desde el teclado
FILE *stdout // salida hacia la pantalla
FILE *stderr // salida hacia la pantalla, usado
para mensajes de error

fprintf(stdout,“Dame un numero: ”); // sale


por stdout
fscanf(stdin,“%d”,&x); // Llega desde stdin
20/02/12 Programación avanzada y métodos numéricos 4
Abrir y cerrar archivo
FILE* arch = fopen(“credito.txt”,”r”);
if(arch == NULL) { // Manejo del error
printf(“Hubo un error al abrir el
programa\n”);
return 0;
}
fclose(arch); // Cierra el archivo
20/02/12 Programación avanzada y métodos numéricos 5
char arch1[20];

printf(“Dame el nombre del archivo: ”);


scanf(“%s”,arch1);

// Introducimos la dirección donde se


guarda la cadena con el nombre
FILE *ap_arch = fopen(arch1,”a”);

// después de manipular el archivo


fclose(ap_arch);
20/02/12 Programación avanzada y métodos numéricos 6
Modos de abrir un archivo
“r” Abre en modo lectura un archivo
Crea archivo para escribir o lo sobreescribe si
“w”
ya existe
“a” Abre para añadir datos al final del archivo
Abre para leer y escribir un archivo,
“r+”
manteniendo su contenido
Crea archivo para escribir y leer o lo
“w+”
sobreescribe
“a+” Abre para escribir y leer al final del archivo
Al agregar b, se abre el archivo en modo
“b”
binario (“rb”, “ab”, “w+b”, “a+b”)
20/02/12 Programación avanzada y métodos numéricos 7

De texto: los datos
están guardados en
Tipos de cadenas de texto, el
acceso es secuencial
archivos 
Binarios: los datos están
guardados en bits, el
acceso es directo

20/02/12 Programación avanzada y métodos numéricos 8


Escritura y lectura de texto
fprintf(flujo, cadena del formato,
variables);
fscanf(flujo, cadena del formato,
direcciones de memoria de las
variables);
Cada que se lee o escribe, el apuntador
del flujo se recorre varias posiciones

20/02/12 Programación avanzada y métodos numéricos 9


Acceso secuencial a archivo de texto
feof(flujo) // Devuelve verdadero si
llegó al final del flujo
rewind(flujo) // Devuelve el
apuntador a la posición inicial del
archivo

20/02/12 Programación avanzada y métodos numéricos 10


Acceso secuencial a archivo de texto
int numero;
FILE *archivo = fopen(“datos.txt”,”r+”);
// Mientras archivo no apunte a EOF, seguirá el ciclo
while ( !feof(archivo) ) {
fscanf(archivo,“%i”,&numero);
printf(“Numero leido: %d”, numero);
fprintf(archivo, “%d”, 0);
}
rewind(archivo); // devuelve a la posición inicial del flujo

20/02/12 Programación avanzada y métodos numéricos 11


Escritura y lectura de datos binarios en
archivos
fwrite(dirección del buffer, tamaño del tipo
de dato, número de elementos, flujo);
fread(dirección del buffer, tamaño del tipo de
dato, numero de elementos, flujo);

También desplazan el apuntador del archivo


tantas posiciones como sean escritas o leídas

20/02/12 Programación avanzada y métodos numéricos 12


Acceso directo a archivo binario
fseek(flujo, desplazamiento en
bytes, origen);

Origen:
 SEEK_SET (inicio del archivo)

 SEEK_CUR (posición actual)

 SEEK_END (final del archivo)

20/02/12 Programación avanzada y métodos numéricos 13


Acceso directo a archivo binario

FILE *flujo1 = fopen(“a.dat”,”w+b”);


int x[45];

// Desplazamiento y lectura
fseek(flujo1,30,SEEK_SET);
fread(x,sizeof(int),45,flujo1);

// Desplazamiento y escritura
fseek(flujo1,40*sizeof(float),SEEK_CUR);
fwrite(x,sizeof(int),45,flujo1);
20/02/12 Programación avanzada y métodos numéricos 14
Consideraciones para elaborar un
archivo
1) Cada línea de texto representará un
registro, en caso de que sea binario, definir
una estructura registro
2) En caso de que sea texto, especificar un
formato de texto para cada registro, el cual
será usado para escribir y leer
3) Es recomendable añadir un número o
clave de identificación al inicio de cada
registro para facilitar la búsqueda

20/02/12 Programación avanzada y métodos numéricos 15


Ejemplo
/* Formato de registro: entero, espacio, cadena,
espacio, cadena, espacio, flotante */
FILE *arch1, *arch2; // asuma que están abiertos
int cuenta; float balance;
char nombre[20], apellido[20];
fprintf(arch, “%d %s %s %0.2f”, cuenta, nombre,
apellido, balance);
fscanf(arch, “%d %s %s-%lf”, &cuenta, nombre,
apellido, &balance);

20/02/12 Programación avanzada y métodos numéricos 16


Ejemplo
struct registro {
int cuenta; float balance;
char nombre[20], apellido[20];
} aux;
FILE *arch1, *arch2; // asuma que están
abiertos
fread(&aux, sizeof(struct registro), 1, arch1);
fwrite(&aux, sizeof(struct registro), 1, arch2);
20/02/12 Programación avanzada y métodos numéricos 17
Bibliografía

Luis Joyanes e Ignacio Zahonero.
Programación en C, C++, Java y UML. Ed.
McGraw Hill Latinoamericana.

Harvey Deitel y Paul Deitel, Como
programar en C. Ed. Prentice Hall.

20/02/12 Programación avanzada y métodos numéricos 18

También podría gustarte