Manejo de archivos en el lenguaje C

18

Click here to load reader

description

Diapositivas correspondientes al tema 1.3 de Programación avanzada y métodos numéricos, impartida en la Facultad de Ingeniería de la UNAM.

Transcript of Manejo de archivos en el lenguaje C

Page 1: Manejo de archivos en el lenguaje C

Archivos y Bancos de Datos

Page 2: Manejo de archivos en el lenguaje C

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

Page 3: Manejo de archivos en 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

Page 4: Manejo de archivos en el lenguaje C

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

Page 5: Manejo de archivos en el lenguaje C

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

Page 6: Manejo de archivos en el lenguaje C

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);

Page 7: Manejo de archivos en el lenguaje C

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”)

Page 8: Manejo de archivos en el lenguaje C

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

Page 9: Manejo de archivos en el lenguaje C

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

Page 10: Manejo de archivos en el lenguaje C

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

Page 11: Manejo de archivos en el lenguaje C

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

Page 12: Manejo de archivos en el lenguaje C

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

Page 13: Manejo de archivos en el lenguaje C

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)

Page 14: Manejo de archivos en el lenguaje C

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

Page 15: Manejo de archivos en el lenguaje C

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

Page 16: Manejo de archivos en el lenguaje C

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);

Page 17: Manejo de archivos en el lenguaje C

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);

Page 18: Manejo de archivos en el lenguaje C

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.