La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Estructuras externas de Datos: Archivos

Presentaciones similares


Presentación del tema: "Estructuras externas de Datos: Archivos"— Transcripción de la presentación:

1 Estructuras externas de Datos: Archivos
Programación, Algoritmos y Estructuras de Datos. Estructuras externas de Datos: Archivos 1. Introducción. 1.1. Ficheros de texto y binarios. 2. Declaración, apertura y cierre de ficheros. 3. Entrada/Salida con ficheros de texto. 3.1. Lectura/Escritura de caracteres. 3.2. Lectura/Escritura de cadenas de caracteres. 3.3. Lectura/Escritura con formato. 4. Entrada/Salida con ficheros binarios. 5. Otras funciones útiles sobre ficheros. Facultad de Ingeniería – UNLP Junio de 2009.

2 Programación, Algoritmos y Estructuras de Datos.
Introducción. Hasta ahora los programas realizados permiten manejar datos procedentes del teclado, los cuales han sido almacenados en variables de memoria (RAM). Como sabemos, los datos contenidos en las variables de memoria se pierden al finalizar el programa que las utiliza. De esta manera no es posible guardar los datos introducidos durante una ejecución del programa para ser utilizados en futuras ejecuciones. Con el uso de ficheros (archivos) se puede solucionar ese problema, ya que los ficheros no residen en la memoria del ordenador. Un fichero es una colección de datos organizados que se almacena en un soporte externo de almacenamiento masivo, como un disco duro, un pen drive, un disco compacto, etc. Estos soportes no se borran cuando finaliza la ejecución del programa, ni siquiera cuando se apaga el ordenador, por tanto los datos de los ficheros se pueden utilizar en futuras ejecuciones del programa. Una operación de salida o escritura de datos en un fichero será el paso de información desde una variable de memoria al fichero. Por el contrario, una operación de entrada o lectura de datos de un fichero será el paso de información desde el fichero a alguna variable de memoria. En C todas las operaciones de entrada y salida tienen lugar a través de funciones de la biblioteca estándar (stdio.h). Facultad de Ingeniería – UNLP Junio de 2009.

3 Programación, Algoritmos y Estructuras de Datos.
1.1. Ficheros de texto y binarios. En C se puede trabajar con los ficheros de dos modos: en modo texto y en modo binario. En modo texto los datos se graban en los ficheros en formato de texto, es decir como secuencia de caracteres. En modo binario los datos son grabados en su representación binaria, es decir como secuencia de bytes. Por ejemplo, si grabamos en un fichero el valor de tipo int, en modo texto se guardaría la secuencia de 5 caracteres “16711”, mientras que en modo binario se guardaría una secuencia de 2 bytes (int), los que corresponden a la representación binaria del valor con 16 bits:  16711 = A G Esos dos bytes, según el código ASCII, corresponden a los caracteres ‘A’ y ‘G’. Si editamos el fichero para ver el contenido del mismo en ese último caso, observaremos en pantalla “GA”, primero la G porque es el byte menos significativo. Facultad de Ingeniería – UNLP Junio de 2009.

4 Programación, Algoritmos y Estructuras de Datos.
Diferencia importante a tener en cuenta entre archivos de texto y binarios: Un final de línea, que se representa en C por un único carácter, el ‘\n’ (10 del ASCII), se traduce al escribirlo en un fichero en modo texto por dos caracteres: CR (Carriage Return o retorno de carro, 13 del ASCII) y LF(Line Feed o avance de línea, 10 del ASCII). Al leerse esos dos caracteres del fichero en modo texto ocurre la traducción inversa, obteniéndose el único carácter ‘\n’ del C. Sin embargo, esa traducción no tiene lugar en modo binario, por lo que al escribir el ‘\n’ se almacena solamente el LF, y al leer el LF se obtendrá el carácter ‘\n’. Facultad de Ingeniería – UNLP Junio de 2009.

5 Programación, Algoritmos y Estructuras de Datos.
2. Declaración, apertura y cierre de ficheros. El acceso a un fichero se realiza siempre a través de un puntero. Este puntero apunta a una posición (byte) determinada del fichero, que es a la que se podrá acceder en ese momento. El puntero irá avanzando posiciones en el fichero automáticamente a medida que se van leyendo o escribiendo datos, por lo que apuntará siempre a la posición siguiente a la última leída o escrita. La declaración de un puntero a fichero se realiza usando el tipo FILE definido en stdio.h, de la siguiente forma: FILE *<puntero_a_fichero>; Ej. FILE *pf; //pf será un puntero a un fichero. Antes de utilizar un fichero en un programa, ya sea para escribir datos en él y/o para leer datos de él, el fichero debe ser abierto, con lo que se establece un canal de comunicación entre el programa y el fichero. La función para abrir un fichero se denomina fopen() y su sintaxis es: <pf> = fopen(“<nombre_fichero>”, “<modo_apertura>”); Facultad de Ingeniería – UNLP Junio de 2009.

6 Programación, Algoritmos y Estructuras de Datos.
Como puede verse, esta función devuelve un puntero a fichero, <pf>, que será el puntero que quede asociado al fichero abierto hasta que sea cerrado. Todas las operaciones sobre el fichero se realizarán a través de ese puntero <pf>. Para indicar el fichero que se desea abrir se usa la cadena de caracteres <nombre_fichero>, la cual puede incluir, además del nombre del fichero, la ruta completa donde está ubicado, es decir la unidad de almacenamiento y la carpeta. No olvidar que la barra invertida (\) de la ruta debe escribirse dos veces (\\), porque si se escribe sólo una vez es interpretada como secuencia de escape. Con la cadena <modo_apertura> se indicará si se va a usar el fichero en modo texto o en modo binario, además servirá para especificar si se va a leer del fichero, se va a escribir en él o ambas cosas. Se pueden emplear los siguientes modos de apertura: Modo de apertura F.Texto F.Binario Significado r rb Abre un fichero para lectura (read) w wb Crea un fichero para escritura (write) a ab Abre un fichero para añadir (add) r+ r+b Abre un fichero para lectura/escritura w+ w+b Crea un fichero para lectura/escritura a+ a+b Abre o crea un fichero para lectura/escritura Facultad de Ingeniería – UNLP Junio de 2009.

7 Programación, Algoritmos y Estructuras de Datos.
Como puede verse en la tabla, los modos de apertura para ficheros en modo binario son los mismos que en modo texto, simplemente se le añade la letra ‘b’. El modo de apertura indicará qué debe hacer el sistema con el fichero, dependiendo de si existe o no. Por ejemplo, abrir para lectura un fichero que no exista producirá un error. Además el modo de apertura también establece donde apuntará el puntero al abrir el fichero, al principio o al final del mismo. Por ejemplo, si deseamos añadir datos al fichero, el puntero deberá colocarse al final, mientras que si queremos leer todos los datos, deberá colocarse al principio. Por otro lado, un fichero abierto para lectura no permitirá realizar escrituras en él, a no ser que se cierre y se vuelve a abrir para escritura. En la siguiente tabla se concretan todos estos casos. F.Tex. F.Bin. Fichero ya existe Fichero no existe Lectura Escritura Posición Puntero r rb Correcto * Error * Principio w wb Borra contenido Se crea a ab Añadir Final r+ r+b Lect/Esc w+ w+b a+ a+b Lect/Añadir Facultad de Ingeniería – UNLP Junio de 2009.

8 Programación, Algoritmos y Estructuras de Datos.
Si la función fopen() tiene éxito, es decir abre el fichero sin ningún problema, devolverá el puntero al fichero. Por el contrario, si se ha producido algún error al intentar la apertura devuelve el valor NULL. Por tanto, después de ejecutar la función fopen(), el programa deberá comprobar siempre si el puntero devuelto vale NULL. Ej FILE *fptr; //Especificando sólo nombre de fichero... if ((fptr = fopen("texto.txt", "w")) == NULL ) { printf ( "ERROR" ); getch(); exit(1); } //Especificando unidad y nombre de fichero... if ((fptr = fopen("C:cursos.dat", "r+b")) == NULL ) //Especificando unidad, carpeta y nombre de fichero... if ((fptr=fopen("C:\\BC\\cursos.dat","a+b"))==NULL) Facultad de Ingeniería – UNLP Junio de 2009.

9 Programación, Algoritmos y Estructuras de Datos.
Cuando un programa deja de necesitar un fichero, éste debe cerrarse, cortándose por tanto el canal de comunicación entre el programa y el fichero. Para cerrar un fichero se utiliza la función fclose(), cuya sintaxis es: fclose (<pf>); Lógicamente, se cerrará el fichero que tuviera asociado el puntero <pf>. Este puntero quedará entonces disponible para ser utilizado en la apertura de cualquier otro fichero. En caso de éxito, fclose() devuelve un cero, mientras que cualquier otro valor devuelto indicará la existencia de algún error. Ej. FILE *ptr; if ((fptr = fopen ("texto.txt", "w")) == NULL ) { printf( "Error de apertura"); getch(); exit(1); } if (fclose(fptr) != 0) printf( "Error de cierre"); getch(); exit(1); Facultad de Ingeniería – UNLP Junio de 2009.

10 Programación, Algoritmos y Estructuras de Datos.
3. Entrada/Salida con ficheros de texto. Veamos inicialmente las operaciones de lectura y escritura de caracteres individuales y posteriormente de cadenas. Aunque todas estas funciones pueden emplearse con ficheros binarios, lo normal es hacerlo con ficheros de texto. Más adelante serán comentadas las funciones que suelen emplearse con ficheros binarios. 3.1. Lectura/Escritura de caracteres. Para la lectura de un único carácter de un fichero se usan las funciones fgetc() o getc(), las cuales son idénticas, no presentan ninguna diferencia. La sintaxis de ambas es la misma, por lo que sólo se expone la de una de ellas: char caracter; caracter= fgetc(pf); En la variable caracter quedará el char leído del fichero apuntado por pf. Automáticamente el puntero avanzará a la posición siguiente del fichero. Después de leer el último carácter, al realizar una nueva lectura la función fgetc() devuelve el carácter EOF (End Of File), constante definida en stdio.h cuyo valor es –1 e indica que se ha llegado al final del fichero. Para comprobar el final de un fichero es conveniente usar la función feof(), ya que los ficheros binarios pueden contener algún byte cuyo valor sea el mismo que el de EOF, sin ser el final del fichero. La función feof() será comentada más adelante. Facultad de Ingeniería – UNLP Junio de 2009.

11 Programación, Algoritmos y Estructuras de Datos.
Veamos un ejemplo:  #include <stdio.h> void main (void) { FILE *fp; char car; if ((fp = fopen (“C:LEEME.TXT”, "r" )) == NULL ) printf("Error de apertura.");getch();exit(1); } car = fgetc(fp); //lee el primer carácter. while ( car != EOF ) printf(“%c”, car); car = fgetc(fp); if (fclose(fp) != 0) printf( "Error al cerrar fichero.");getch();exit(1); Archivo01.c Facultad de Ingeniería – UNLP Junio de 2009.

12 Programación, Algoritmos y Estructuras de Datos.
Para escribir un único carácter en un fichero se usan las funciones putc() o fputc(), las cuales son idénticas, por lo que se utilizan del mismo modo. La sintaxis es: char car; fputc( car, pf); Antes de realizar la escritura debe colocarse en la variable car el caracter que se desea escribir en el fichero que esté apuntado por pf. El carácter será escrito en la posición del fichero donde esté apuntando el puntero, avanzando éste de posición automáticamente. Si en la posición donde se escribe un caracter ya existe otro, éste será sobrescrito. Sin embargo, si el fichero ha sido abierto con el modo a o a+, los datos siempre se escriben al final del fichero, aunque el puntero esté en cualquier otra posición. Esto es así para todas las operaciones de escritura, tanto en ficheros de texto como binarios. Cuando la función fputc() realiza la escritura con éxito devuelve el carácter escrito, pero si se produce algún error devolverá EOF. Es conveniente usar la función ferror() para detectar esta situación, como ya se ha comentado. Facultad de Ingeniería – UNLP Junio de 2009.

13 Programación, Algoritmos y Estructuras de Datos.
#include <stdio.h> #include <stdlib.h> void main (void) { FILE *fp; char car; if ((fp = fopen (“TEXTO.TXT, "w" )) == NULL ) printf("Error de apertura."); getch(); exit(1); } clrscr();printf(“Texto a escribir en fichero:”); while ((car = getche()) != 27) if (car == 13) //Si se pulsa ENTER fputc(‘\n’, fp); // CR + LF else fputc(car, fp); Archivo02.c if (fclose(fp) != 0) { printf( "Error al cerrar fichero."); getch(); exit(1); } Nota: Si se desea escribir en un fichero un texto tecleado carácter a carácter, la tecla ENTER se graba como un CR sólo (13 del ASCII), no como salto de línea (CR+LF). Si se lee ese fichero abierto en modo texto, ese carácter CR se desprecia, como si no estuviera, pero si se lee el fichero abierto en modo binario, se recibe el carácter CR. Facultad de Ingeniería – UNLP Junio de 2009.

14 Programación, Algoritmos y Estructuras de Datos.
3.2. Lectura/Escritura de cadenas de caracteres. La función fgets() permite leer una cadena de caracteres de un fichero. La sintaxis de esta función es: char cad[80]; fgets( cad, <longitud>, <pf>); El número de caracteres que se leen del fichero <pf> es <longitud>-1 y quedan cargados en la cadena de caracteres cad. El carácter fin de cadena ‘\0’ se añade automáticamente al final de la cadena. La lectura de un salto de línea (CR + LF) del fichero provoca que la función fgets() no lea más caracteres, aunque no haya cumplido la lectura del número de caracteres especificado por <longitud>-1. Un salto de línea que sea leído (CR + LF) del fichero quedará almacenado en la cadena como el carácter ‘\n’ (10 del ASCII) y a continuación se almacena el carácter de fin de cadena ‘\0’. Cuando la función fgets() realiza una lectura y encuentra el carácter fin de fichero, EOF, éste no es almacenado en la cadena, sino que se finaliza la misma con el ‘\0’. Facultad de Ingeniería – UNLP Junio de 2009.

15 Programación, Algoritmos y Estructuras de Datos.
Si la función fgets() tiene éxito devuelve un puntero a la cadena cad. Si se produce algún error devuelve el puntero nulo (NULL), quedando el contenido de cad indeterminado. Cuando se encuentra el final del fichero, la función fgets() también devuelve puntero nulo, por lo que es conveniente utilizar las funciones feof() y ferror() para distinguir si se ha producido algún error o se ha leído el fin del fichero. Ej. void main ( void ) { FILE *fp; char cad[80]; //En cad caben 79 caracteres. if (( fp = fopen("texto.txt", "r" )) == NULL ) {printf("No se puede abrir fichero\n");getch();exit(1);} while (!feof(fp)) //Se leen 79 caracteres:80-1 if(fgets(cad,80,fp)!=NULL) printf("%s", cad); } if (fclose(fp) != 0) printf( "Error al cerrar fichero.");getch();exit(1); Facultad de Ingeniería – UNLP Junio de 2009.

16 Programación, Algoritmos y Estructuras de Datos.
La función fputs() permite escribir una cadena de caracteres en un fichero. La sintaxis de esta función es: char cad[80]; fputs (cad, <pf>); La cadena de caracteres cad será escrita en el fichero <pf>, en la posición donde esté apuntando el puntero de ese fichero, excepto si se ha abierto con a o a+, en cuyo caso la cadena se añade al final del fichero. El carácter fin de cadena ‘\0’, que es el último almacenado en cad, no es escrito en el fichero. Si la cadena cad contiene el carácter ‘\n’ (10 de ASCII), en el fichero se escribirán los caracteres CR y LF (salto de línea). Si al ejecutar fputs() se produce algún error, esta función devuelve un valor distinto de cero, pero en caso de éxito devolverá 0. Facultad de Ingeniería – UNLP Junio de 2009.

17 Programación, Algoritmos y Estructuras de Datos.
Ej.Escribir cada cadena tecleada al fichero program.TXT. #include <stdio.h> #include <stdlib.h> #include <string.h> void main ( void ) { FILE *fp; char cad[80]; if ((fp = fopen("C:program.txt","w")) == NULL) {printf("No se puede abrir fichero\n");getch(); exit(1);} do printf("Teclee cadena:\n"); gets(cad); strcat(cad,"\n"); //Añade \n a cad. if (fputs(cad, fp) != 0) exit(1); } while (cad[0] != '\n'); if (fclose(fp) != 0) {printf( "Error al cerrar fichero.");getch(); exit(1);} } Archivo03.c Facultad de Ingeniería – UNLP Junio de 2009.

18 Programación, Algoritmos y Estructuras de Datos.
3.3. Lectura/Escritura con formato. Las funciones fprintf() y fscanf() son idénticas a sus homólogas printf() y scanf(), pero con la excepción de que permiten realizar operaciones de lectura y escritura con cualquier fichero.  Las sintaxis de estas funciones son: fprintf(<pf>,<cadena_control>, <lista_argumentos>); fscanf (<pf>,<cadena_control>, <lista_argumentos>); Como puede verse la sintaxis coincide con la de las funciones printf() y scanf(), excepto que ahora presentan un parámetro nuevo, <pf>, que permite especificar con qué fichero se desea realizar la lectura con fscanf() o la escritura con fprintf(). La <cadena_control> y la <lista_argumentos> se utilizan como ya fue explicado para las funciones printf() y scanf(). La función fprintf() convierte todos los datos a formato texto antes de escribirlos en el fichero, es decir no escribe en binario. Facultad de Ingeniería – UNLP Junio de 2009.

19 Programación, Algoritmos y Estructuras de Datos.
Ej. int num = 123; fprintf(fp, “%d”, num); En ese ejemplo, el número 123 de tipo int 123 almacenado en num (ocupa 2 bytes), se grabará en el fichero en modo texto, es decir se guardarán los tres caracteres 1, 2 y 3 (ocupan 3 bytes), no se guardan los 2 bytes (int) donde está codificado el valor 123. De forma análoga, la función fscanf() lee del fichero siempre en modo texto, para posteriormente convertirlo al formato que se haya especificado en <cadena_control>. Ej. int num; fscanf(fp,”%d”, &num); //Lee 2 caracteres del fichero En ese ejemplo, si leemos el fichero anterior donde se han escrito los caracteres “123” con la función fprintf(), después del fscanf() en num quedará almacenado el valor 123 ya convertido a tipo int. Debe recordarse que la función fscanf() espera la dirección de las variables, es decir &num en este ejemplo. Cuando la función fscanf() intenta leer del fichero caracteres que no pueden ser convertidos al tipo especificado en <cadena_control>, no lee nada, dejando en la variable donde se iba almacenar la lectura el valor que tuviera antes de ejecutar fscanf(). Facultad de Ingeniería – UNLP Junio de 2009.

20 Programación, Algoritmos y Estructuras de Datos.
La función fprintf() devuelve el número de caracteres escritos cuando tiene éxito. En caso contrario devuelve un número negativo. La función fscanf() devuelve el número de variables donde se han guardado correctamente los valores leídos del fichero. Cuando a ninguna variable le ha asignado un valor devuelve 0. Si fscanf() detecta el final del fichero devolverá EOF. A pesar de ser las funciones más fáciles de usar para lectura/escritura en ficheros, no son las más usadas debido a estas conversiones que se han comentado y que realizan antes de escribir en el fichero (fprintf()) o después de leer del fichero (fscanf()). En esas conversiones se consume tiempo, por tanto no es lo más eficiente. Así cuando sea importante la velocidad del programa y el tamaño del fichero sea grande se emplearán las funciones fread() y fwrite() que veremos a continuación. Antes un ejemplo integrador: Archivo04.c Facultad de Ingeniería – UNLP Junio de 2009.

21 Programación, Algoritmos y Estructuras de Datos.
4. Entrada/Salida con ficheros binarios. Ya hemos comentado que en un fichero binario los datos son grabados como sucesión de bytes, es decir tal y como están en memoria RAM. Por ejemplo, una variable de tipo float en un fichero binario siempre ocupará 4 bytes, independientemente del valor de dicha variable. Esos 4 bytes serán la representación en coma flotante de dicho valor. En un fichero de texto todo se graba como una sucesión de caracteres, por lo que si el valor de tipo float es , ocupará 7 bytes (7 caracteres) en el fichero de texto (en lugar de 4 bytes). El punto decimal también ocupará un byte. La función fread() permite leer una serie de bytes de un fichero, ya sea de texto o binario, sin realizar ningún tipo de conversión. Esto significa que en el caso de ficheros binarios, se pueden leer los datos en el formato en que fueron grabados. Por ejemplo, para leer una cantidad numérica que fue escrita en el fichero con el tipo float, habrá que leer 4 bytes. La sintaxis de esta función es: fread( <Dir_Variable>, <nº_bytes>, <cuenta>, <pf>); Facultad de Ingeniería – UNLP Junio de 2009.

22 Programación, Algoritmos y Estructuras de Datos.
Se leerán del fichero <pf> el número de bytes <nº_bytes> tantas veces como indique <cuenta>, dejando dichos bytes grabados en memoria a partir de la dirección <Dir_Variable>. Esta dirección será la de una variable con el tamaño suficiente para guardar los datos leídos. El número de bytes que se leen será por tanto el resultado del producto: <nº_bytes> * <cuenta>. Ej. int num; fread(&num, sizeof(int), 1, fp); //Se leen 2*1=2 bytes del fichero, que caben en num. float Notas[5]; fread(Notas, sizeof(float), 5, fp); //Se leen 4*5=20 bytes del fichero, que caben en Notas En este ejemplo, en el segundo caso se leerán 20 bytes, ya que se lee 5 veces el número de bytes indicado por sizeof(float). Facultad de Ingeniería – UNLP Junio de 2009.

23 Programación, Algoritmos y Estructuras de Datos.
La función fread() devuelve un valor que indica cuántas veces ha leído el <nº_bytes>, que no siempre coincide con <cuenta>, ya que ha podido detectarse el final del fichero o producirse un error antes de cumplir la lectura de todas las veces indicadas en <cuenta>. Por tanto, si el valor devuelto es menor que <cuenta> significa que ha habido algún error o ha llegado el fin del fichero. Cuando el fichero ha sido abierto en modo texto, si fread() lee un salto de línea (CR + LF), estos dos caracteres se convierten automáticamente al carácter ‘\n’ (10 del ASCII). Cuando el fichero ha sido abierto en modo binario, no se produce conversión, por lo que se leen los dos caracteres, CR (13 del ASCII) y LF (10 del ASCII). Facultad de Ingeniería – UNLP Junio de 2009.

24 Programación, Algoritmos y Estructuras de Datos.
La función fwrite() permite escribir datos en un fichero como una sucesión de bytes, sin ser convertidos a texto. La sintaxis de esta función es: fwrite( <Dir_Variable>, <nº_bytes>, <cuenta>, <pf>); A partir de la dirección de memoria <Dir_Variable> se leerán tantos bytes como se indique en <nº_bytes> tantas veces como se especifique en <cuenta> y se escribirán en el fichero <pf>. El número de bytes escritos será por tanto el resultado del producto: <nº_bytes> * <cuenta>. Ej. int num=1067; fwrite(&num, sizeof(int), 1, fp); //Graba 2 bytes en el fichero, desde la dirección num, //por tanto el valor 1067 queda escrito en el fichero. float Notas[5]={5.5, 7.25, 8.5, 4.75, 9.5}; fwrite(Notas, sizeof(float), 5, fp); //Se escriben 4*5=20 bytes en el fichero, desde la //dirección Notas, quedando las 5 notas grabadas en el //fichero. Facultad de Ingeniería – UNLP Junio de 2009.

25 Programación, Algoritmos y Estructuras de Datos.
Uno de los usos más comunes de fread() y fwrite() es el manejo de ficheros en forma de conjunto de registros, donde cada registro está dividido en campos. Para ello en el programa debe definirse un tipo de estructura con el mismo formato que el registro del fichero, con el objeto de leer y escribir registros completos con las funciones fread() y fwrite() respectivamente, en lugar de leer y escribir campos concretos. Ej. Teniendo un array de estructuras ya cargado con datos, deberá grabarse en un fichero y después dejarlo en otro array de estructuras. struct t_lista { char nombre[20]; char apellido[40]; float nota; } lista1[30], lista2[30]; // 30 estructuras, 2 veces. Facultad de Ingeniería – UNLP Junio de 2009.

26 Programación, Algoritmos y Estructuras de Datos.
…inicializo lista[1]…. FILE *fp; int i; if ( (fp = fopen("fich.dat", "wb")) == NULL ) { printf("No se puede abrir.\n");getch();exit(1); } //Escribe 30 registros desde el array lista1. for ( i = 0; i < 30; i++) if (fwrite(&lista1[i],sizeof(struct t_lista),1,fp)!=1) printf("Error de escritura"); fclose(fp); if ( (fp = fopen("fich.dat", "rb")) == NULL ) printf("No se puede abrir.\n");getch(); exit(1); //Lee 30 registros, dejándolos en el array lista2. if (fread(&lista2[i], sizeof(struct t_lista),1,fp)!=1) printf("Error de lectura"); fclose(fp);} Archivo05.c Facultad de Ingeniería – UNLP Junio de 2009.

27 Programación, Algoritmos y Estructuras de Datos.
5. Otras funciones útiles sobre ficheros. La función feof() permite conocer si la última lectura se ha realizado del final del fichero, por lo que para conocer si se ha llegado al final, previamente debe realizarse una lectura. La sintaxis de esta función es: int fin_f; fin_f = feof(<pf>); Si devuelve un valor distinto de 0 (verdadero) significa que el puntero del fichero está en el final del mismo. En otro caso la función devuelve 0 (falso). Como ya se ha explicado, en un fichero binario se puede leer un valor entero igual al valor de EOF, por lo que alguna rutina de lectura que finalice al encontrar EOF podría acabar realmente antes de llegar al final físico del fichero. Por ello es conveniente usar la función feof(). La función ferror() indica si se ha producido algún error en una operación de lectura o escritura sobre un fichero. Su sintaxis es: int error; error = ferror(<pf>); Si devuelve el valor 0 (falso) significa que no ha ocurrido ningún error y un valor distinto de 0 (verdadero) en caso contrario. Facultad de Ingeniería – UNLP Junio de 2009.

28 Programación, Algoritmos y Estructuras de Datos.
La función rewind() permite colocar el puntero al principio del fichero. Su sintaxis es: rewind(<pf>); Como sabemos, en un fichero sólo se puede acceder, ya sea para leer o escribir, a la posición que indique el puntero. Con la función rewind() podemos llevar ese puntero al principio. Además esta función inicializa los indicadores de fin de fichero y de error asociados al fichero en cuestión. No devuelve ningún valor. Ej. Cargar cadenas tecleadas en un fichero y posteriormente leerlas y visualizarlas, sin cerrar y volver a abrir el fichero. La función remove() permite borrar un fichero del disco, no sólo su contenido. Su sintaxis es: remove( <nombre_fichero>); La función rename() permite cambiar el nombre de un fichero, el cual puede estar abierto o cerrado. Su sintaxis es: rename(NombreActual, NombreNuevo); Facultad de Ingeniería – UNLP Junio de 2009.

29 Programación, Algoritmos y Estructuras de Datos.
La función fseek() permitirá colocar el puntero del fichero en una posición determinada, para acceder al fichero a partir de esa posición. Su sintaxis es: fseek( <pf>, <nº_bytes>, <origen> ); El puntero se colocará en la posición del fichero <pf> que corresponda a desplazarse el número de bytes indicado por <nº_bytes> partiendo desde la posición indicada por <origen>. La primera posición del fichero es la 0, no la 1. El valor <nº_bytes> debe ser de tipo long, por lo que si se usa un valor literal debe escribirse una L después de dicho valor, por ejemplo -7L para desplazarse 7 bytes hacia atrás desde <origen>. Si en lugar de un literal, se usa una variable que no sea long, podrá convertirse colocando (long) antes de dicha variable, (long)Var. El <origen> puede tomar los valores 0, 1 o 2, a los que se les han asociado unas constantes definidas en stdio.h, para facilitar el uso: SEEK_SET principio del fichero (valor entero 0). SEEK_CUR posición actual del puntero (valor entero 1). SEEK_END final del fichero (valor entero 2). La función fseek() devuelve 0 en caso de éxito y distinto de 0 en el caso contrario. Facultad de Ingeniería – UNLP Junio de 2009.

30 Programación, Algoritmos y Estructuras de Datos.
Ej. fseek(fp,0L,SEEK_SET); //Colocar puntero al principio fseek(fp,-5L,SEEK_CUR); //Retroceder 5 posiciones fseek(fp,0L,SEEK_END); //Colocar puntero al final La función ftell() permite obtener la posición actual a la que esté apuntando el puntero del fichero, contando el número de bytes que hay desde el principio del fichero hasta la posición actual del puntero. Su sintaxis es: long pos; pos = ftell(<pf>); Esta función devuelve -1 cuando se ha producido algún error. long i; i = ftell(fp); if (i == -1) printf("Error"); else printf("Esta en el byte %ld del fichero", i); Facultad de Ingeniería – UNLP Junio de 2009.

31 Hemos terminado con los Temas de la Práctica 6. Suerte en el examen!.
Programación, Algoritmos y Estructuras de Datos. Hemos terminado con los Temas de la Práctica 6. Suerte en el examen!. Facultad de Ingeniería – UNLP Junio de 2009.


Descargar ppt "Estructuras externas de Datos: Archivos"

Presentaciones similares


Anuncios Google