15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits...

25
Estructuras de datos (Prof. Edgardo A. Franco) 1 Tema 15: Manejo de archivos en lenguaje C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom

Transcript of 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits...

Page 1: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Estructuras de datos (Prof. Edgardo A. Franco)

1

Tema 15: Manejo de archivos en lenguaje C

M. en C. Edgardo Adrián Franco Martínez http://[email protected]@edfrancom edgardoadrianfrancom

Page 2: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Contenido• Introducción

• Tipos de archivos

• Manejo de archivos en C

• Modo texto

• Modo binario

• Manejo del desplazamiento sobre el archivo

2

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 3: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Introducción

• Los datos que hemos tratado hasta el momento hanresidido en la memoria principal. Sin embargo, lasgrandes cantidades de datos se almacenannormalmente en un dispositivo de memoriasecundaria. Estas colecciones de datos se conocencomo archivos.

• Un archivo es un conjunto de bits almacenado en undispositivo de memoria secundaria, el cuál puede seralmacenado con un conjunto de propiedades yrecuperado de la misma manera por el sistemaoperativo para que un programa tenga acceso a este.

3

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 4: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

• Un archivo es identificado por un nombre y ladescripción de la carpeta o directorio que locontiene.

• Los archivos digitales se llaman así porque son losequivalentes digitales de los archivos en tarjetas,papel o microfichas del entorno de oficinatradicional.

4

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 5: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Tipos de archivos

• Hay dos tipos de archivos, archivos de texto yarchivos binarios.

• Un archivo de texto es una secuencia de caracteresorganizadas en líneas terminadas por un carácterde nueva línea.

• En estos archivos se pueden almacenar, fuentes deprogramas, texto plano, base de datos simples, etc.

• Los archivos de texto se caracterizan por ser planos,es decir, solo contienen caracteres de texto.

5

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 6: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

• Un archivo binario es una secuencia de bytes quetienen una correspondencia uno a uno con undispositivo externo. Así que no tendrá lugar ningunatraducción de caracteres.

• El número de bytes escritos (leídos) será el mismoque los encontrados en el dispositivo externo.

• E.g. de estos archivos son Fotografías, imágenes,texto con formatos, archivos ejecutables(aplicaciones), etc.

6

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 7: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Manejo de archivos en C

• En C, un archivo es un concepto lógico que puedeaplicarse a muchas cosas desde archivos de discohasta terminales o una impresora.

• Para trabajar con un archivo se asocia unaestructura especial de tipo FILE con un archivoespecifico realizando una operación de apertura.

• Una vez que el archivo está abierto, la informaciónpuede ser intercambiada entre este y el programa.

7

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 8: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

• Se puede conseguir la entrada y la salida de datos aun archivo a través del uso de la biblioteca defunciones estándar "stdio.h"; C puro no tienepalabras claves que realicen las operaciones de E/S.

• La tabla siguiente da un breve resumen de lasfunciones que se pueden utilizar.

• Observe que la mayoría de las funciones comienzan conla letra “f” (file), esto es un vestigio del estándar C deUnix.

8

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 9: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

9

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Nombre Función

fopen() Abre un archivo

fclose() Cierra un archivo

fgets() Lee una cadena de un archivo

fputs() Escribe una cadena de un archivo

fseek() Busca un byte especifico de un archivo

fprintf() Escribe una salida con formato en el archivo

fscanf() Lee una entrada con un formato en el archivo

feof() Devuelve cierto si se llega al final del archivo

ferror() Devuelve cierto si se produce un error

rewind() Coloca el cursor de posición en el archivo al principio del mismo

remove() Borra un archivo

fflush() Vacía un archivo

fread() Lee un bloque de una “stream” de datos (binario)

fwrite() Escribe un bloque de datos a un archivo como “stream” (binario)

Page 10: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

El puntero a un archivo.

• El puntero a un archivo es un tipo especial queopera como hilo común que unifica el sistema deE/S con buffer.

• Un puntero a un archivo es un puntero a unainformación que define varias cosas sobre él,incluyendo el nombre, el estado y la posición actualdel archivo.

• En esencia identifica un archivo especifico y utilizala secuencia asociada para dirigir el funcionamientode las funciones de E/S con buffer. 10

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 11: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

…El puntero a un archivo.

• Un puntero a un archivo es una variable de tipopuntero al tipo FILE que se define en "stdio.h".

• Un programa necesita utilizar punteros a archivospara leer o escribir en los mismos. Para obtener unavariable de este tipo se utiliza una secuencia comoesta:

FILE *F;

11

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 12: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

12

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Apertura de un archivo

• La función fopen() abre una secuencia para quepueda ser utilizada y la asocia a un archivo. Suprototipo es:

FILE * fopen (const char nombre_archivo, const char modo);

• Donde nombre_archivo es un puntero a una cadenade caracteres que representan un nombre valido delarchivo y puede incluir una especificación deldirectorio.

• La cadena a la que apunta modo determina como seabre el archivo.

Page 13: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Modos de apertura de un archivo

Modo Significado

r Abre un archivo de texto para lectura (read)

w Abre un archivo de texto para escritura desde el comienzo (write)

a Abre un archivo de texto para escritura al final del archivo (append)

rb Abre un archivo binario para lectura (read binary)

wb Abre un archivo de binario para escritura desde el comienzo (write binary)

ab Abre un archivo binario para escritura al final del archivo (append binary)

r+ Abre o crea un archivo de texto para lectura / escritura

w+ Crea un archivo de texto para lectura / escritura

a+ Añade o crea un archivo de texto para lectura / escritura

rb+ Abre o crea un archivo binario para lectura / escritura

wb+ Crea un archivo binario para lectura / escritura

ab+ Añade o crea un archivo binario para lectura / escritura13

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 14: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Abrir un archivo - fopen()

• La función fopen() devuelve un puntero a archivo. Unprograma nunca debe alterar el valor de ese puntero.

• Si se produce un error cuando se esta intentando abrirun archivo, fopen() devuelve un puntero nulo (NULL).

• Se puede abrir un archivo bien en modo texto o binario.En la mayoría de las implementaciones, en modo texto,la secuencias de retorno de carro / salto de línea seconvierten a caracteres de salto de línea en lectura.

14

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 15: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

… Abrir un archivo - fopen()

• En la escritura, ocurre lo contrario: los caracteres de salto delínea se convierten en salto de línea. Estas conversiones noocurren en archivos binarios.

• La macro NULL está definida en "stdio.h". La función fopen()detecta cualquier error al abrir un archivo: como por ejemplodisco lleno o protegido contra escritura antes de comenzar aescribir en él.

• Si se usa fopen() para abrir un archivo para escritura,entonces cualquier archivo existente con el mismo nombre seborrará y se crea uno nuevo.

15

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 16: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

… Abrir un archivo - fopen()

• Si se quiere añadir al final del archivo entonces debe usar elmodo a. Si se usa a y no existe el archivo, se devolverá unerror.

• La apertura de un archivo para las operaciones de lecturarequiere que exista el archivo. Si no existe, fopen() devolveráun error.

• "+" abre un archivo para las operaciones de leer / escribir, elsistema operativo no lo borrará si existe; sin embargo, si noexiste, el sistema operativo lo creará.

16

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 17: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Cierre de un archivo - fclose()

• La función fclose() cierra una secuencia que fueabierta mediante una llamada a fopen(). Escribetoda la información que todavía se encuentre en elbuffer en el disco y realiza un cierre formal delarchivo a nivel del sistema operativo.

• Un error en el cierre de una secuencia puedegenerar todo tipo de problemas, incluyendo lapérdida de datos, destrucción de archivos y posibleserrores intermitentes en el programa.

17

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 18: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

…Cierre de un archivo.

int fclose(FILE *F);

• Donde F es el puntero al archivo devuelto por lallamada a fopen(). Si se devuelve un valor cerosignifica que la operación de cierre ha tenido éxito.

• Generalmente, esta función solo falla cuando undisco se ha retirado antes de tiempo o cuando noqueda espacio libre en el mismo.

18

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Page 19: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

Manejo de archivos en C (Modo texto)

19

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

• Para introducir u obtener datos en modo texto de un archivotenemos las siguientes cuatro funciones:• fprintf()

• fscanf()

• fgets()

• fputs()

• Estas funciones se comportan exactamente como prinft() yscanf(), gets() y puts() excepto que operan sobre archivo. Susprototipos son:

int fprintf(FILE *F, const char *cadena_de_control, .....);

int fscanf(FILE *F, const char *cadena_de_control, .....);

char *fputs(char *str, FILE *F);

char *fgets(char *str, int long, FILE *F);

Page 20: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

20

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez• El operar con los archivos en modo texto facilita la

comprensión de los archivos por cualquier usuario que logreabrir el archivo con otra aplicación que permita leer el textoclaro.

• Desgraciadamente esta es la forma más compleja dealmacenar registros e información así como recuperarla porparte de aplicaciones profesionales, por ello no esrecomendable trabajar solo con el modo texto.

• El modo binario permite un almacenamiento mucho másseguro, fiable y fácil de manejar (si se diseña correctamente laaplicación).

Page 21: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

• Para introducir u obtener datos en modo binario de unarchivo tenemos las siguientes funciones:• fread()

• fwrite()

• Sus prototipos son:

21

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

Manejo de archivos en C (Modo binario)

size_t fread ( void * ptr, size_t size, size_t count, FILE * archivo);

size_t fwrite(void *ptr, size_t tamano, size_t count, FILE * archivo);

Page 22: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

fread()

• Esta función lee un bloque de una "stream" de datos. Efectúala lectura de un arreglo de elementos "count", cada uno de loscuales tiene un tamaño definido por "size". Luego los guardaen el bloque de memoria especificado por "ptr". El indicadorde posición de la cadena de caracteres avanza hasta leer latotalidad de bytes. Si esto es exitoso la cantidad de bytesleídos es (size*count).

22

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

size_t fread ( void * ptr, size_t size, size_t count, FILE * archivo);

Page 23: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

• ptr: Puntero a un bloque de memoria con un tamañomínimo de (size*count) bytes.

• size: Tamaño en bytes de cada elemento (de los que se van aleer).

• count : Número de elementos, los cuales tienen un tamaño"size".

• archivo: Puntero a FILE, que especifica el archivo de entrada.

23

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

size_t fread ( void * ptr, size_t size, size_t count, FILE * archivo);

Page 24: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

fwrite()

• Esta función está pensada para trabajar con registros delongitud constante y forma pareja con fread.

• Es capaz de escribir hacia un fichero uno o varios registros dela misma longitud almacenados a partir de una dirección dememoria determinada. El valor de retorno es el número deregistros escritos, no el número de bytes. Los parámetros son:un puntero a la zona de memoria de donde se obtendrán losdatos a escribir, el tamaño de cada registro, el número deregistros a escribir y un puntero FILE del fichero al que se harála escritura.

24

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez

size_t fwrite(void *ptr, size_t tamano, size_t count, FILE * archivo);

Page 25: 15 Manejo de archivos en lenguaje C - Edgardo A. Franco · •Un archivo es un conjunto de bits almacenado en un dispositivo de memoria secundaria, el cuál puede ser almacenado con

fseek()

• Esta función está sitúa el puntero (cursor) de un archivo enuna posición deseada, trabaja para modo binario y texto.

int fseek(FILE *archivo, long offset, int origen);

• archivo es un puntero a la estructura del archivo

• offset es un entero largo que especifica el número de bytes de origen,donde se colocará el cursor.

• origen es un número entero que especifica la posición de origen.Puede ser:

• SEEK_SET: El origen es el comienzo del archivo

• SEEK_CUR: El origen es la posición actual

• SEEK_END: El origen es el final del archivo

Manejo de archivos en C (Manejo del desplazamiento sobre el archivo)

25

15

Man

ejo

de

arch

ivo

s en

len

guaj

e C

Alg

ori

tmia

y p

rogr

amac

ión

est

ruct

ura

da

Pro

f. Ed

gard

o A

dri

án F

ran

co M

artí

nez