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
20/02/12 Programación avanzada y métodos numéricos 3
Flujo de datos en C
Flujo de datos
FILE *archivo // flujo de datos
20/02/12 Programación avanzada y métodos numéricos 4
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 5
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 6
char arch1[20];
printf(“Dame el nombre del archivo: ”);scanf(“%s”,arch1);
// Introducimos la dirección donde se guarda la cadena con el nombreFILE *ap_arch = fopen(arch1,”a”);
// después de manipular el archivofclose(ap_arch);
20/02/12 Programación avanzada y métodos numéricos 7
Modos de abrir un archivo“r” Abre en modo lectura un archivo
“w”Crea archivo para escribir o lo sobreescribe si
ya existe
“a” Abre para añadir datos al final del archivo
“r+”Abre para leer y escribir un archivo,
manteniendo su contenido
“w+”Crea archivo para escribir y leer o lo
sobreescribe
“a+” Abre para escribir y leer al final del archivo
“b”Al agregar b, se abre el archivo en modo
binario (“rb”, “ab”, “w+b”, “a+b”)
20/02/12 Programación avanzada y métodos numéricos 8
Tipos de archivos
De texto: los datos están guardados en cadenas de texto, el acceso es secuencial
Binarios: los datos están guardados en bits, el acceso es directo
20/02/12 Programación avanzada y métodos numéricos 9
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 10
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 11
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 12
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 13
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 14
FILE *flujo1 = fopen(“a.dat”,”w+b”);int x[45];
// Desplazamiento y lecturafseek(flujo1,30,SEEK_SET);fread(x,sizeof(int),45,flujo1);
// Desplazamiento y escriturafseek(flujo1,40*sizeof(float),SEEK_CUR);fwrite(x,sizeof(int),45,flujo1);
Acceso directo a archivo binario
20/02/12 Programación avanzada y métodos numéricos 15
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 16
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 17
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 18
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.
Top Related