Está en la página 1de 67

Programacin Estructurada II

Archivos

Introduccin

Un fichero no es ms que una serie de datos seguidos, almacenados en un soporte, que se referencia por un nombre. Es importante indicar que los ficheros no son nicamente los archivos que guardamos en el disco duro, en C todos los dispositivos del ordenador se tratan como ficheros: la impresora, el teclado, la pantalla, entre otros.

La entrada y salida a ficheros es uno de los aspectos ms delicados de cualquier lenguaje de programacin.

Introduccin

Los servicios ofrecidos por los sistemas operativos varan enormemente de un sistema a otro.

Las libreras del C proporcionan un gran conjunto de funciones, muchas de ellas derivadas de los servicios que ofrece el Unix.

En C hay dos tipos de funciones de entrada/salida a ficheros. Las primeras son derivadas del SO Unix y trabajan sin buffer. Las segundas son las que fueron estandarizadas por ANSI y utilizan un buffer intermedio.
3

Introduccin

Adems, hacen distinciones si trabajan con ficheros binarios o de texto.

Funciones de alto nivel o estndar. Son las ms utilizadas, por su fcil implementacin. Al programador no le hace falta controlar los buffers ni las conversiones de datos. Funciones de bajo nivel. Son mucho ms prximas a las funciones que utiliza el sistema operativo para gestionar archivos; requieren ms control por parte del programador, el cdigo, por decirlo de alguna manera, se hace ms duro. Permiten un grado de control ms alto, en cuanto a como y cuando se han de guardar los datos y la velocidad de los accesos a disco es ms rpida.
4

Introduccin

Las funciones de C no hacen distincin si trabajan con una terminal, cinta o ficheros situados en un disco. Todas las operaciones se realizan a travs de streams. Un stream est formado por una serie ordenada de bytes. Leer o escribir de un fichero implica leer o escribir del stream. Para realizar operaciones se debe asociar un stream con un fichero, mediante la declaracin de un puntero a una estructura FILE. En esta estructura se almacena toda la informacin para interactuar con el SO. Este puntero es inicializado mediante la llamada a la funcin fopen(), para abrir un fichero.
5

Introduccin

Cuando se ejecuta todo programa desarrollado en C hay tres streams abiertos automticamente. Estos son:

stdin: dispositivo de entrada estndar stdout: dispositivo de salida estndar stderr: dispositivo de salida de error estndar

Si arrancamos un programa en C bajo MS-DOS abre 5 ficheros como mnimo:

stdin-Entrada estndar (teclado), stdout-Salida estndar (pantalla), stderr-Salida de errores (pantalla), stdaux-Salida auxiliar (com), stdprnsalida impresora estandar (lpt1)

Introduccin

Normalmente estos streams trabajan con el terminal, aunque el sistema operativo permite redireccionarlos.

Las funciones printf() y scanf() que se han visto, utilizan stdout y stdin respectivamente.
Los archivos se pueden abrir en modo texto, o en modo binario. Esta distincin tiene origen en las primeras versiones de C desarrolladas para el sistema operativo UNIX, que utilizaba el modo texto; despus MS-DOS utiliz el modo binario.

Introduccin

En el lenguaje C se puede abrir un archivo de las dos formas. Las diferencias entre el modo texto y el modo binario son bsicamente dos.

text stream (Flujos de texto):

Son una sucesin de caracteres originado en lneas que finalizan con un carcter de nueva-lnea (newline).

En estos flujos puede no haber una relacin de uno a uno entre los caracteres que son escritos (ledos) y los del dispositivo externo, por ejemplo, una nuevalnea puede transformarse en un par de caracteres (un retorno de carro y un carcter de salto de lnea).
En modo texto, los nmeros se guardan en disco como cadenas de caracteres; por ejemplo, el nmero 6590 ocupando 4 byte, no tienen formato.

Introduccin

Flujos binarios:

Son flujos de bytes que tienen una correspondencia uno a uno con los que estn almacenados en el dispositivo externo. Esto es, no se presentan desplazamientos de caracteres. Adems el nmero de bytes escritos (ledos) es el mismo que los almacenados en el dispositivo externo. En modo binario, un nmero se guarda tal y como est en memoria. Un int, por ejemplo el nmero visto anteriormente (6590), se guarda tal y como se representa en memoria, y con dos bytes (que es lo que ocupa un dato tipo int).
9

Introduccin

Esta diferencia es importante considerarla cuando se leen archivos:

Supongamos que tenemos un fichero de disco con 7 caracteres donde el cuarto carcter es el carcter fin de fichero (en sistema operativo DOS es el carcter con cdigo ASCII 26). Si abrimos el fichero en modo texto, slo podemos leer los 3 primeros caracteres, sin embargo, si lo abrimos en modo binario, leeremos los 7 caracteres ya que el carcter con cdigo ASCII 26 es un carcter como cualquier otro. Ejemplos de estos archivos son Fotografas, imgenes, texto con formatos, archivos ejecutables (aplicaciones), etc.
10

Introduccin

Respecto a la velocidad de la memoria y de la CPU, los dispositivos de entrada y salida son muy lentos.

Puede haber tres, cuatro y hasta cinco rdenes de magnitud entre la velocidad de la CPU y la de un disco duro.
Por ello, conviene reducir en nmero de lecturas y escrituras a disco. La mejor forma de realizar esto es mediante un buffer. Un buffer es una rea de memoria en la cual los datos son almacenados temporalmente, antes de ser enviados a su destino.

11

Introduccin

Por ejemplo, las operaciones de escritura de caracteres a un fichero se realizan sobre el buffer del stream. nicamente cuando se llena el buffer se escriben todos los caracteres sobre el disco de una vez. Esto ahorra un buen nmero de operaciones sobre el disco. Las funciones del C nos permiten modificar el tamao y comportamiento del buffer de un stream.
12

Resumen

En C, cualquier cosa externa de la que podemos leer o en la que podemos escribir datos es un fichero.

El programador escribe (lee) datos en estos ficheros a travs de los flujos de cada fichero.
De esta forma el programador escribe (lee) los datos de la misma forma en todos los tipos de ficheros independientemente del tipo de fichero que sea. Aunque conceptualmente todos los flujos son iguales, en realidad hay dos tipos: flujos de texto y flujos binarios.

13

Resumen

Hay tres flujos de texto predefinidos automticamente al principio del programa:

que

se

abren

stdin, stdout stderr.

Estos tres flujos se cierran automticamente al final del programa.


14

Pasos para operar un fichero

Para utilizar las funciones de ficheros se debe incluir el fichero stdio.h

Este define los prototipos de todas las funciones, la declaracin de la estructura FILE y algunas macros.
Una macro importante es EOF, que es el valor devuelto por muchas funciones cuando se llega al final de fichero. Los pasos a realizar para realizar operaciones con un fichero son los siguientes: 15

Pasos para operar un fichero


Crear Fichero:

Crear un nombre interno de fichero. Esto se hace en C declarando un puntero de fichero (o puntero a fichero). Un puntero de fichero es una variable puntero que apunta a una estructura llamada FILE. Esta estructura incluye entre otras cosas informacin sobre el nombre del archivo, la direccin de la zona de memoria donde se almacena el fichero, tamao del buffer, toda la informacin necesaria para poder trabajar con un fichero. 16

Pasos para operar un fichero

Definicin de la estructura FILE:

Ejemplo:

FILE *pf;

/* pf es un puntero de fichero */
17

Pasos para operar un fichero


Abrir Fichero

En lenguaje C, la funcion para abrir un archivo es fopen(). Esta toma dos strings como parmetros. El prototipo se encuentra en el fichero stdio.h y es:

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

Nombre_fichero: es el nombre que tiene el archivo en el disco; se puede


poner la va de acceso completa, pero teniendo en cuenta que la barra invertida (\) hay que repetirla en una cadena de caracteres.

Modo: es la manera como se abre el archivo.

18

Pasos para operar un fichero


Abrir Fichero

Si el fichero con nombre nombre_fichero no se puede abrir devuelve NULL.

19

Pasos para operar un fichero


Abrir Fichero

20

Pasos para operar un fichero


Abrir Fichero

Ejemplo:
FILE *fichero; fichero = fopen ("c:\\autoexec.bat", "r");

Abrir un archivo, significa indicarle al sistema que establezca una conexin entre el lugar donde se encuentran los datos en el disco, y una zona de memoria; esta zona de memoria es el famoso buffer.
21

Pasos para operar un fichero


Abrir Fichero

Y todo esto para qu?


Quien pasa los datos del buffer al archivo de disco y viceversa? Cual es el tamao del buffer ?

22

Pasos para operar un fichero


Comprobar si est abierto

Una cosa muy importante despus de abrir un fichero es comprobar si realmente est abierto. El sistema no es infalible y pueden producirse fallos: el fichero puede no existir, estar daado o no tener permisos de lectura. Si intentamos realizar operaciones sobre un puntero tipo FILE cuando no se ha conseguido abrir el fichero puede haber problemas.
23

Pasos para operar un fichero


Comprobar si est abierto

Por eso es importante comprobar si se ha abierto con xito. Si el fichero no se ha abierto el puntero fichero (puntero a FILE) tendr el valor NULL, si se ha abierto con xito tendr un valor distinto de NULL. Por lo tanto para comprobar si ha habido errores nos fijamos en el valor del puntero.
24

Pasos para operar un fichero


Comprobar si est abierto

Ejemplo :

25

Pasos para operar un fichero


Cerrar El Fichero

Una vez realizadas todas las operaciones deseadas sobre el fichero hay que cerrarlo. Aunque el C cierra automticamente todos los ficheros abiertos al terminar el programa, es muy aconsejable cerrarlos explcitamente. Se realiza mediante la llamada a la funcin fclose() que cierra un fichero determinado o fcloseall() que cierra todos 26 los archivos abiertos.

Pasos para operar un fichero


Cerrar El Fichero

Estas funciones escriben la informacin que todava se encuentre en el buffer y cierra el archivo a nivel de MS-DOS.

La funcin fclose() cierra el fichero asociado con el flujo pf y vuelca su buffer.


27

Pasos para operar un fichero


Cerrar El Fichero

Si fclose() se ejecuta correctamente devuelve el valor 0, EOF si se produce algn error, estos problemas se pueden producir si el disco est lleno, por ejemplo.

28

Pasos para operar un fichero


Comprobar fin de fichero feof

Cuando entramos en el bucle while, la lectura se realiza hasta que se encuentre el final del fichero. Para detectar el final del fichero se pueden usar dos formas:

Con la funcin feof() Comprobando si el valor de letra es EOF.

La funcin feof tiene la siguiente forma:


29

Pasos para operar un fichero


Comprobar fin de fichero feof

Esta funcin comprueba si se ha llegado al final de fichero en cuyo caso devuelve un valor distinto de 0. Si no se ha llegado al final de fichero devuelve un cero. Por eso lo usamos del siguiente modo: o

La segunda forma que comentaba arriba consiste en comprobar si el carcter ledo es el de fin de fichero EOF:
30

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Escritura de caracteres en el fichero putc y fputc Estas dos funciones escriben un carcter en el fichero abierto por el puntero que se pone como parmetro.

Si todo se produce correctamente la funcin devuelve el propio carcter, si hay algn error devuelve EOF. La cabecera que utiliza es <stdio.h>.

31

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

32

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

33

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

34

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

35

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Lectura de caracteres del fichero getc y fgetc

Devuelve el carcter ledo del fichero e incrementa el indicador de posicin del archivo. Si se llega al final del fichero la funcin devuelve EOF. Todos los valores que lee los transforma a carcter. Cabecera es <stdio.h>. La funcin fgetc es equivalente a getc, la diferencia es que getc est implementada como macro) 36

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

El formato de la funcin getc y de fgetc es:

En este caso lo usamos como:

Tomamos un carcter de fichero, lo almacenamos en letra y el puntero se coloca en el siguiente carcter.


37

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

38

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

39

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

40

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 3:

41

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 3:

42

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 4:

43

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 4:

44

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Escritura de cadenas en el fichero fputs

Escribe el contenido de la cadena puesta como primer parmetro de la funcin. El carcter nulo no se escribe en el fichero. Si se produce algn error devuelve EOF y si todo va bien devuelve un valor no negativo. La cabecera <stdio.h>. La funcin fputs trabaja junto con la funcin fgets que vimos en el item anterior:

45

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

46

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

47

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Lectura de cadenas de un fichero fgets

La funcin fgets es muy til para leer lneas completas desde un fichero. El formato de esta funcin es:

Lee un determinado nmero de caracteres de un fichero y los pasa a una variable de tipo cadena.
48

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Lee caracteres hasta que encuentra:


Un carcter de salto de linea ( '\n' ) Un EOF o hasta que lee longitud_max-1 caracteres y aade '\0' al final de la cadena.

La cadena leda la almacena en buffer. Si se encuentra EOF antes de leer ningn carcter o si se produce un error la funcin devuelve NULL, en caso contrario devuelve la direccin de buffer.
49

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

50

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 1:

51

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

52

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

53

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 2:

54

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 3:

55

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto


Ejemplo 3:

56

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Entrada/Salida con formato fprintf, fscanf

Estas funciones son muy tiles cuando se han de guardar datos de diferentes tipos en un archivo de texto. Suponga que quiere guardar el nombre, la edad y la nota de un individuo; el nombre es una cadena de caracteres, pero la edad y la nota son datos del tipo int. Utilizando estas funciones, puede guardar y leer datos de diferentes tipos. 57

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Piense que los datos siempre se guardan en formato carcter, tanto si son del tipo char, como si son del tipo int, float, o cualquier otro tipo numrico. Estas dos funciones trabajan igual que sus equivalentes printf y scanf. La nica diferencia es que podemos especificar el fichero sobre el que operar (si se desea puede ser la pantalla para fprintf o el teclado para fscanf).

58

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

La funcin fprintf se comporta exactamente a printf, excepto en que toma un argumento ms que indica el stream por el que se debe realizar la salida. De hecho, la llamada printf("x") es equivalente a fprintf ( stdout,"x").

59

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 1:

Hay que tener en cuenta, que en C, (al igual que UNIX ya que C se dise para crear el S.O. UNIX) todo dispositivo E/S es tratado como un fichero, luego podremos usar esta funcin para trabajar con cualquier dispositivo de este tipo.
60

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 2:

61

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 2:

62

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 2:

63

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 3:

64

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 3:

65

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 4:

66

Lectura Y Escritura De Ficheros E/S Estndar: Archivos de texto

Ejemplo 4:

67

También podría gustarte