1. ENTRADA Y SALIDA POR
ARCHIVOS
Sugerencias y herramientas para crear para crear y presentar diapositivas en
formato panorámico
2. Contenido
Flujos
Puntero FILE
Apertura de un archivo
Creación de archivo secuencial
Archivos binarios en C
Funciones para acceso aleatorio
F i l i
Argumentos de main ()
Ejercicios
3. Introducción
Hasta el momento se han realizado las operaciones básicas
p
de entrada y salida. La lectura de datos se realiza desde
un teclado, y la escritura de datos se realiza en el monitor y
en la impresora de su sistema
En C existe la biblioteca stdio.h estandarizada por ANSI;
esta biblioteca proporciona tipos de datos, macros y
funciones para acceder a los archivos. El manejo de
archivos en C se hace mediante el concepto de flujo
(streams) o canal, o también denominado secuencia
4. Flujo
Un flujo (stream) es una abstracción que se refiere a un
j ( ) q
flujo o corriente de datos que fluyen entre un origen y
un destino. Entre el origen y el destino debe existir una
conexión o canal por la que circulen los datos. La
apertura de un archivo supone establecer la conexión
del programa con el dispositivo que contiene al archivo
archivo,
por el canal que comunica el archivo con el programa
van a fluir las secuencias de datos
5. Puntero FILE
En el programa el archivo tiene un nombre interno que
es un puntero a una estructura predefinida (puntero a
archivo). Esta estructura contiene información sobre el
archivo,
archivo tal como la dirección del buffer que utiliza el
utiliza,
modo de apertura del archivo, el ultimo carácter leído
del buffer y otros detalles que generalmente el usuario
no necesita saber. El id ifi d d l tipo d l
i b identificador del i de las
estructuras es FILE y esta declarada en el archivo de
cabecera stdio.h;;
6. Apertura de un archivo
Para procesar un archivo en C la primera operación que
hay que realizar es abrir el archivo. El programa accede a
los archivos a través de un puntero a la estructura FILE, la
función de apertura devuelve dicho puntero. La función
p p
para abrir un archivo es fopen() y el formato de llamada
es:
Fopen(nombre_archivo,
Fopen(nombre archivo modo);
Nombre = cadena Contiene el identificador externo del archivo
Modo = cadena Contiene el modo en que se va a tratar el archivo
7. Ejemplo 13 3
13.3
Se desea abrir un archivo de nombre LICENCIA.EST para obtener ciertos datos
#include <stdio.h>
#i l d < di h>
#include <stdlib.h>
FILE *pf;
Char [] “C LICENCIA EST”
Ch nm[]=“C:LICENCIA.EST”;
Pf=fopen(nm, “r”);
If (pf==NULL)
{
Puts(“Error al abrir el archivo.”);
Exit (1);
}
8. Modos de apertura de un archivo
Al abrir el archivo fopen() se espera como segundo argumento el modo de
tratar el archivo. Fundamentalmente se establece si el archivo es de
lectura, escritura o añadido; y si es de texto o binario
9. Cont…
Cont
En estos modos no se ha establecido el tipo de archivo, de
p ,
texto o binario. Se utiliza la letra t para modo de texto, la b
para modo binario como ultimo carácter de la cadena modo.
Por consiguiente los modos de abrir un archivo de texto:
“rt”, “wt”, “at”, “r+t”, “w+t”, “a+t”
Y los modos de abrir un archivo binario:
“rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b”
rb wb ab r+b w+b a+b
10. Ejemplo 13 5
13.5
Se dispone de un archivo de
p #include <stdio.h>
texto, se requiere leerlo #include <stdlib.h>
main () {
para realizar un cierto FILE *pf1 , *pf2 ;
proceso y escribir datos char org[]="C:LICENCIA.EST";
char dst[]="C:RESUMEN.REC" ;
resultantes en el archivo
pf1 = fopen(org, "rt");
binario pf2 = fopen(dst,"wb");
if (pf1 == NULL || pf2 == NULL)
puts ( "Error al abrir los archivos. ");
system("pause");
(" ")
exit (1) ; }
11. NULL y EOF
Las funciones de biblioteca que devuelven un puntero
q p
(strcpy(), fopen()…) especifican que si no pueden
realizar la operación devuelven NULL
Las funciones de librería de E/S de archivos,
generalmente empiezan por f de file, tienen
especificado que son d tipo entero d tal f
ifi d de i de l forma que si
i
la operación falla devuelven EOF, también devuelven
EOF para indicar que se ha leído el fin de archivo
12. Cierre de archivos
Los archivos en C trabajan con una memoria intermedia, son
con buffer. La entrada y salida de datos se almacena en
este buffer, volcándose cuando esta lleno. Siempre que se
termina de procesar un archivo y siempre que se termine la
p p q
ejecución del programa los archivos abiertos hay que
cerrarlos para que entre otras acciones se vuelque el buffer.
La función fclose(puntero file) cierra el archivo asociado al
fclose(puntero_file)
puntero_file.
int fclose(FILE* pf);
( p );
13. Ejemplo 13 7
13.7
Abrir dos archivos de texto, después se cierra cada uno de ellos
#include <stdio.h>
FILE *pf1, *pf2 ;
pf1 = fopen(“C:DATOS.DAT", “a+");
pf2 = fopen("C:TEMPS.RET",“a+");
fclose(pf1);
fclose(pf2);
14. Creación de un archivo secuencial
Una vez abierto un archivo para escribir datos hay que
p yq
grabar los datos en el archivo. Las funciones de
entrada y de salida de archivos tienen mucho parecido
con las ffunciones utilizadas para entrada y salida para
los flujos stdin (teclado) y stdout (pantalla). Todas tienen
una versión para archivos que empiezan por la letra f f,
así se tiene fprint(), fscanf(), fputs(), fgets(); la mayoría
de funciones especificas empiezan por f
p p p
15. Funciones putc() y fptuc()
Escriben un carácter en el archivo asociado al puntero a
FILE. El formato de llamada:
putc(c, puntero_archivo);
fputc(c, puntero_archivo);
f ( hi )
Siendo c el carácter a escribir
Ejemplo 13 1
Ej l 13.1
Se desea crear un archivo salida.pta con los caracteres
introducidos por el teclado
16. Funciones getc() y fgetc()
Estas funciones leen un carácter del archivo asociado al puntero a
FILE. D
FILE Devuelven el carácter leído o EOF si es fin de archivo (o si ha
l l á l íd i fi d hi ( i h
habido un error). El formato de llamada es:
getc (puntero_archivo);
fgetc (puntero archivo);
Ejemplo 13.2
El archivo salida.pta creado en el problema anterior se d
hi lid t d l bl t i desea l leer
para mostrarlo por pantalla y contar las líneas que tiene
17. Funciones fputs() y fguets()
Estas funciones escriben/leen una cadena de caracteres
en el archivo asociado. La función fputs() escribe una
cadena de caracteres; el formato de llamada es:
;
fputs(cadena, puntero_archivo);
La función fguets() lee una cadena de caracteres de un
archivo. El formato de llamada es:
fguets (cadena n puntero archivo);
(cadena, n, puntero_archivo);
18. Ejercicio 13 1 1
13.1.1
El archivo cartas.dat contiene un texto al que se
desea añadir nuevas líneas, de longitud mínima 30
caracteres,
caracteres desde un archivo primero dat
primero.dat
19. Funciones fprintf() y fscanf() ejm13 4 1
fscanf(), ejm13.4.1
Las funciones printf() y scanf() permiten escribir o
leer variables cualquier tipo de dato estándar, los
códigos de formato (%d %f ) indican a C la
(%d, %f…)
transformación que debe realizar con la secuencia
de caracteres La misma funcionalidad tiene
caracteres.
fprintf() y fscanf() con los flujos (archivos asociados)
a que se aplican
20. Función feof()
Diversas funciones de lectura de caracteres devuelven
EOF cuando leen el carácter de fin de archivo. La
función feof() realiza el cometido anterior, devuelve un
valor distinto de 0 (true) cuando se lee el carácter de
fin de archivo, en caso contrario devuelve 0 (false)
While(!feof(pf))
Whil (!f f( f))
{….
}
21. Función rewind()
Una vez que se alcanza el fin de un archivo, nuevas
llamadas a feof() siguen devolviendo un valor
distinto de cero Con la función rewind() se sitúa el
cero.
puntero del archivo al inicio de este. El formato de
llamada es:
Rewind(puntero_archivo)
Ejemplo 13 10
Ej l 13.10
22. Archivos binarios en C
Para abrir un archivo en modo binario hay que
especificar la opción b en el modo. Los archivos
binarios son secuencias de 0 s y 1 s los modos para
0,s 1,s.
abrir un archivo binario son los mismos que para
abrir un archivo de texto sustituyendo t por b;
texto,
“rb”, “wb”, “ab”, “r+b”, “w+b”, “a+b”
23. Función de salida fwrite()
La función fwrite() escribe un buffer de cualquier
tipo de dato en un archivo binario. El formato de
llamada es:
fwrite(direccion_buffer, tamaño, num_elementos,
puntero_archivo);
t hi )
Ejemplo 13.12
24. Función de lectura fread()
Esta función lee un archivo n bloques de bytes y los
q y
almacena en un buffer. El numero de bytes de cada
bloque (tamaño) se pasa como parámetro, al igual que
el numero n de bloques y la dirección del buffer (o
ff
variable) donde se almacena. El formato de llamada
es:
Fread (direccion_buffer, tamano,n,puntero_archivo);
Ejemplo 13 13
Ej l 13.13
25. Funciones para acceso aleatorio
Las funciones fseek() y ftell() se usan principalmente para
acceso directo a archivos en C. estas consideran el archivo
como una secuencia de bytes; el numero de byte es el índice
del archivo. Según se va leyendo o escribiendo registros o
g y g
datos en el archivo, el programa mantiene a través de un
puntero la posición actual. Con la llamada a la función
ftell() se obtiene el valor de dicha posición
El formato para llamar a fseek ( ) es:
fseek(puntero_archivo, desplazdmiento, origen);
(p , p , g );
26. Función ftell
La posición actual del archivo se puede obtener
p p
llamando a la función ftell() y pasando un puntero al
archivo como argumento. La función devuelve la
posición como numero de bytes (en entero largo: long
int) desde el inicio del archivo (byte 0)
Para ll
P llamar a l f ió se pasa como argumento el
la función l
puntero a FIL,E.
long i t ft ll(FILE * f)
l int ftell(FILE *pf);
27. Ejercicios
Escriba un programa para abrir un archivo de
caracteres cuyo nombre y acceso se introducen por
teclado en modo lectura; en el caso de que el resultado
de la operación sea erróneo abrir el archivo en modo
erróneo,
escritura
Escribir un programa que compare dos archivos de
p g q p
texto. El programa ha de mostrar las diferencias entre
el primer archivo y el segundo, precedidas del numero
de línea y de columna
28. Patrón de prueba de pantalla panorámica (16:9)
Prueba de la
relación de
aspecto
(Debe parecer circular)
4x3
16x9