Archivosconceptos
Contienen los datos que se almacenan en dispositivos de almacenamientomasivo: disquetes, discos duros, DROM, etc.
Conjunto de datos relacionados entre si. Organizacin de los datos:
0 Sin una estructura regular: texto, cdigo C.0 En registros.
Apellido1 Apellido2 Nombre Edad Telf.
Registros Gmez Gmez Juan 35 60433423
Prez Mrquez Luca 20 95545434
Campos
Manejo de Archivos en C
Los tipos de datos y funciones necesarias para el manejo de Archivos seencuentran en la libreria de entrada/salida estndar stdio (standardinput/output).0 #include
Los Archivos se manejan utilizando variables de tipo FILE *0 Ejemplos:
El asterisco debe aparecer delanteFILE *archivo; del nombre de la variable.FILE *nominas, *ventas;
0 Estas variables pueden tener un valor nulo que se representa por la constante NULL.
Los pasos generales para manejar Archivos son los siguientes:0 Abrir el archivo.0 Realizar las operaciones de entrada/salida (lectura y/o escritura de datos en el
archivo).0 Cerrar el archivo.
Apertura del archivoFunciOn fopen
Mediante la apertura asociamos el archivo con una variable de tipo FILE* Una vez realizada la apertura, la variable se utiliza para acceder al archivo. Se utiliza la siguiente funciOn:
FILE *fopen( char nombre[], char modo[] );
0 Parmetros: nombre: Es una cadena de caracteres que contiene el nombre del archivo.
Puede contener la ruta. modo: Es una cadena de caracteres que indica el modo de apertura del archivo.
Puede contener los siguientes valores:0 rt El archivo se abre para leer.0 wt El archivo se abre para escribir. Se borra y se escribe al principio.0 at El archivo se abre para aadir. Se aaden los datos al final.
0 Valor devuelto: Si el archivo no ha podido abrirse, devuelve NULL. Si el archivo se ha abierto correctamente, devuelve un valor de tipo FILE* que
se puede utilizar para acceder al archivo.
Apertura del archivoFuncin fopen: nombre del archivo
Para especificar el nombre delarchivo con la ruta de acceso, seutiliza la siguiente sintaxis:
E:\\clases\\FI\\ejemplo.txt
Cada elemento de la ruta (unidad, carpeta y archivo) seseparan con la doble barra invertida \\
Apertura del archivoFuncin fopen: modo de apertura
Existen tres modos de apertura:0 Lectura (rt)
Este modo se utiliza para leer datos del archivo. Si el archivo no existe, no se puede abrir y fopen devuelve NULL.
0 Escritura (wt) Este modo se utiliza para escribir datos en el archivo desde el principio. Si el archivo existe, se borra su contenido. Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado. Deben existir todas las carpetas de la ruta especificada; si alguna no existe,
fopen no podr abrir el archivo.0 Aadir (at)
Este modo se utiliza para escribir datos al final del archivo. Si el archivo existe, se mantiene su contenido. Si el archivo no existe, se crea un archivo nuevo vaco con el nombre indicado. Deben existir todas las carpetas de la ruta especificada; si alguna no existe,
fopen no podr abrir el archivo.
Apertura del archivoFunciOn fopen: ejemplo 1a
Abrimos el archivo prueba1.txt para escritura.#include Si el archivo existe, se borra su contenido.void main() {
FILE *fa, *fb;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {
printf( Error\n ); Comprobamos si el archivo se hareturn; podido abrir.
}
El valor devuelto por fopen se guarda en fa. Ahora podemosutilizar fa para acceder al archivo prueba1.txt.
fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) {
printf( Error\n );return; Podemos abrir ms de un archivo
}... Resto de sentencias del programa
}
Apertura del archivoFunciOn fopen: ejemplo 1b
El programa anterior se puede escribir de la siguiente manera:
#include void main() {
FILE *fa, *fb;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {
printf( Error\n );}else {
fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) {
printf( Error\n );}else {
... Resto de sentencias del programa}
}
}
Escritura de datos en el archivoFunciOn fprintf
La funciOn fprintf se utiliza igual que printf. Diferencias entre fprintf y printf:
0 La funciOn fprintf tiene un primer parmetro de tipo FILE*0 La funciOn fprintf escribe en el archivo indicado por su primer parmetro (en vez
de hacerlo por pantalla).
int fprintf( FILE *f, char texto_de_formato[], ... );
Contiene informaciOn Contiene el texto que se va a Valores que se vansobre el archivo en el que escribir (junto con los cOdigos de a imprimir dentrose va a escribir. formato: %d, %f, etc). del texto.
La funcin fprintf devuelve el n de bytes o caracteres escritos en el archivo.En caso de error, devuelve un valor negativo.
Escritura de datos en el archivoFunciOn fprintf: ejemplo 1a
#include void main() { Se crea o se prueba1.txt
FILE *fa, *fb; borra el archivoint i;fa = fopen( c:\\dir1\\prueba1.txt, wt );if (fa == NULL) {
printf( Error\n );return;
}fb = fopen( c:\\dir1\\prueba2.txt, wt );if (fb == NULL) { prueba2.txt
printf( Error\n );return; Se crea o se
} borra el archivo
Contina...
Escritura de datos en el archivoFunciOn fprintf: ejemplo 1b
prueba1.txtEste es el archivo falnea 1lnea 2lnea 3
fprintf( fa, Este es el archivo fa\n );fprintf( fb, Este es el archivo fb\n );for (i=1; i
Cierre del archivoFuncin fclose: ejemplo
fclose(fa); Cierre de los Archivos: el programa no va a seguirfclose(fb); escribiendo en los Archivos.
fb = fopen( c:\\tmp\\prueba3.txt, rt );...
} Las variables fa y fb ya no estnasociadas a ningn archivo.
Podemos volver a utilizar fb para abrir un nuevoarchivo y realizar operaciones de entrada/salidasobre l.
Funciones de escritura de ArchivosFuncin fputs
int fputs( char cad[], FILE *fich );
0 Escribe el contenido de la cadena de caracteres cad en el archivo asociado a fich.0 Devuelve un valor >= 0 si la escritura se ha realizado sin problemas. En caso de error,
devuelve el valor EOF.0 Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, wt );char texto[] = una prueba;fputs( Esto es , f ); prueba.txtfputs( texto, f ); Esto es una prueba
Funciones de escritura de ArchivosFuncin fputc
int fputc( int caracter, FILE *fich );
0 Escribe en el archivo asociado a fich el carcter contenido en el parmetro caracter.0 Devuelve el carcter escrito si la escritura se ha realizado sin problemas. En caso de
error, devuelve el valor EOF.0 Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, wt );fputc( A, f ); prueba.txtfputc( 66, f ); AB
66 es el cdigoASCII del carcter B
Lectura de datos del archivoPosicin de lectura
Posicin de lectura: llamaremos posicin de lectura al punto, dentro del archivo,donde se comenzar a leer los datos.
Cuando se abre un archivo para leer (modo rt), la posicin de lectura se sitaal principio del archivo.
Cada vez que se leen datos del archivo, la posicin de lectura avanza para quela siguiente lectura comience en el lugar donde terminO la anterior.
Ejemplo:
Inicialmente, Esto es una pruebala posicin delectura est alprincipio.
Si leemos 4 Si leemos 6 caracteres, lacaracteres, la posicin de lectura vuelve aposicin de avanzar.lectura avanza.
Cie
rre
Proc
esad
oA
pert
ura
Lectura de datos del archivoFuncin fscanf
La funcin fscanf se utiliza igual que scanf. Diferencias entre fscanf y scanf:
0 La funcin fscanf tiene un primer parmetro de tipo FILE*0 La funcin fscanf lee los datos del archivo indicado por su primer parmetro (en vez
de leerlos del teclado).
int fscanf( FILE *f, char formato[], ... );
Contiene informacin Contiene los cdigos de formato de Variables en las quesobre el archivo en el que los valores que se van a leer (%d, se van a guardar los seva a leer. %f, etc). datos ledos.
La funcin fscanf devuelve el n de valores que han sido ledos del archivo yalmacenados en las variables. Si no ha podido leer ms valores porque hallegado al final del archivo, devuelve EOF.
Lectura de datos del archivoFuncin fscanf: cdigos de formato
Se considera un separador a los siguientes caracteres:0 Carcter espacio: 0 Salto de lnea: \n0 Tabulador: \t
Lectura de valores numricos: %d, %u, %f, %lf, etc0 Se salta todos los separadores hasta encontrar el principio de un nmero:
un digito, +, - o .(para los tipos float y double)0 Si antes de encontrar un nmero, encuentra un carcter distinto de los
anteriores, la lectura termina y no se lee ningn valor numrico del archivo. Lectura de cadena de caracteres: %s
0 Se salta todos los separadores hasta encontrar un carcter distinto0 Lee una cadena de caracteres delimitada por separadores
Lectura de caracteres: %c0 fscanf no se salta ningn carcter, lee el primer carcter que encuentre.
Lectura de datos del archivoFunciOn fscanf: ejemplo
Posicin de lectura#include
void main() { 3.45float v1;int v2; 5.2char c1, c2, c3;FILE *f = fopen( c:\\dir1\\ejemplo.txt, rt );if (f != NULL) { 3.45
fscanf( f, %f, &v1 ); 5.2fscanf( f, %d, &v2 );fscanf( f, %d, &v2 );fscanf( f, %c%c, &c1, &c2 ); En la posicin de lectura hay un .
} No se puede leer un nmero entero.
. 2 La variable v2 conserva su valor (5).fclose(f);3.45
5.2}
NOTA: el simbolo () representa un salto de linea
Funciones de lectura de ArchivosFunciOn fgets
char *fgets( char cadena[], int max, FILE *fich );
0 Lee una secuencia de caracteres del archivo asociado al parmetro fich y los almacenaen el parmetro cadena.
0 La lectura termina cuando se hayan leido max-1 caracteres, se encuentre un salto delinea o se acabe el archivo.
0 Si se encuentra un salto de lnea, este se incluir en la cadena.0 Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, rt );char cad[80];fgets( cad, 80, f );prueba.txt
fgets( cad, 6, f ); Esto esuna prueba
Funciones de lectura de ArchivosFunciOn fgetc
int fgetc( FILE *fich );
0 Lee un carcter del archivo asociado al parmetro fich.0 Devuelve el carcter leido. Si no se puede leer ningn carcter, devuelve el valor EOF.0 Ejemplo:
FILE *f = fopen( c:\\tmp\\prueba.txt, rt );char c1, c2;c1 = fgetc( f ); prueba.txt
c2 = fgetc( f ); Esto esuna prueba
DetecciOn del fin del archivoFunciOn feof
Cuando la posicin de lectura del archivo se encuentra al final del archivo, no sepuede seguir leyendo.
Durante la lectura de datos de un archivo, el programa debe comprobar si se hallegado al final del archivo.
La siguiente funcin nos permite detectar si se ha llegado al final del archivo:
int feof( FILE *fich );
0 Valor devuelto: VERDADERO (distinto de cero): Si en la ltima operacin de lectura se ha
intentado leer fuera del archivo; es decir, si se ha intentado leer despus dellegar al final del archivo.
FALSO (cero): En caso contrario
ArchivosTratamiento secuencial
La secuencia de pasos que seguiremos para el tratamiento secuencial deArchivos es la siguiente:
Abrir archivoLeer un registroMIENTRAS no sea fin de archivo HACER
Procesar el registro ledoLeer un registro
FIN MIENTRASCerrar archivo
ArchivosTratamiento secuencial: ejemplo 1a
Realizar un programa que lea los registros de un archivo de temperaturas que contiene unentero por cada lnea (cada lnea corresponde a un registro). El programa debe imprimir porpantalla los valores ledos.
#include void main() {
int valor;FILE *f = fopen( c:\\ejemplo.txt, rt );if (f == NULL) {
printf( ERROR\n ); Abrimos el archivoreturn;
}fscanf( f, %d, &valor ); Leemos un registrowhile (!feof(f)) {
printf( %d\n, valor ); Procesamos el registrofscanf( f, %d, &valor );
}fclose(f);
}
ArchivosTratamiento secuencial: ejemplo 1b
Si el ltimo registro no termina con un salto de lnea, el valor de dicho registro no aparece enpantalla (no es procesado).
#include void main() {
int valor;FILE *f = fopen( c:\\ejemplo.txt, rt );if (f == NULL) { Supongamos que la posicin de lectura se
printf( ERROR\n ); encuentra en la marca ( ) y que se va areturn; ejecutar la siguiente lnea}
fscanf( f, %d, &valor );while (!feof(f)) { 45
printf( %d\n, valor ); 5fscanf( f, %d, &valor ); 10
}fclose(f);
} Se saltan los separadores Se lee el Se intenta leerhasta encontrar el carcter fuera delarchivo. carcter 1. 0.
ArchivosTratamiento secuencial: ejemplo 2a
Tenemos un archivo temp.txt con las temperaturas en C de tres sensores (llamados A, By C). El siguiente programa copia las temperaturas del sensor A en un archivo llamadotemp_a.txt.
Cada lnea del archivo corresponde a un registro que contiene el nombre del sensor(un carcter) y la temperatura (un entero) separados por un espacio.
Por ejemplo, para el siguiente archivo temp.txt, debe generarse el archivo temp_a.txt quese muestra:
temp.txt Temp_a.txt
A 45 45B 60 55A 55C 32
ArchivosTratamiento secuencial: ejemplo 2b
#include void main() {
FILE *ftemp, *fsal;char sensor, aux;int temp;ftemp = fopen( c:\\dir\\temp.txt, rt ); Abrimos el archivoif (ftemp == NULL) { en modo lectura
printf( ERROR\n );return;
}fsal = fopen( c:\\dir\\temp_a.txt, wt ); Abrimos el archivoif (fsal == NULL) { en modo escritura
printf( ERROR\n );fclose( ftemp ); Antes de terminar, debemosreturn; cerrar el archivo temp.txt
}
Contina...
ArchivosTratamiento secuencial: ejemplo 2c
fscanf( ftemp, %c, &sensor ); Leemos un registro del archivofscanf( ftemp, %d, &temp ); temp.txtfscanf( ftemp, %c, &aux );while (!feof(ftemp)) {
if (sensor == a) { Procesamos el registro leido yfprintf( fsal, %d\n, temp ); escribimos un registro en el archivo
} temp_a.txtfscanf( ftemp, %c, &sensor );fscanf( ftemp, %d, &temp ); Leemos un registro del archivofscanf( ftemp, %c, &aux ); temp.txt
}fclose( ftemp );
Cerramos todos los Archivosfclose( fsal );}
ArchivosTratamiento secuencial: ejemplo 2d
Lectura de un registro del archivo temp.txt:
fscanf( ftemp, %c, &sensor );fscanf( ftemp, %d, &temp );fscanf( ftemp, %c, &aux );
La variable aux se utiliza para leerel salto de lnea del registro yconseguir que la posicin de lecturase site al principio del siguienteregistro
A 45B 60A 55C 32