Вы находитесь на странице: 1из 30

Universidad Tecnológica La Salle

León, Nicaragua

Lenguaje de
Programación II
Unidad III: ARCHIVOS DE DATOS EN C

Docente: Ing. Carolina Robelo


carolina.robelo@ulsa.edu.ni
Archivos de Datos en C
• Muchas aplicaciones requieren escribir o leer
información de un dispositivo de almacenamiento
auxiliar. Tal información se guarda en el dispositivo de
almacenamiento en la forma de un archivo de datos.

• Los archivos de datos nos permiten:


– Almacenar información de modo permanente
– Acceder y modificar información cuando sea
necesario.
Archivos de Datos en C
• En C existen dos tipos diferentes de archivos de datos,
llamados:
– Archivos secuenciales de datos (o estándar)
– Archivos orientados al sistema (o de bajo nivel).

Generalmente es más fácil trabajar con archivos de datos


secuenciales que con los orientados al sistema, y por tanto
son los más usados.
Archivos de Datos Secuenciales
• Archivos de texto: contienen caracteres consecutivos. Estos
caracteres pueden interpretarse como:
– Datos individuales
– Componentes de una cadena de caracteres
– Números.

La manera de interpretarlos es determinada por las funciones de


biblioteca usadas para transferir la información o por las
especificaciones de formato dentro de las funciones de biblioteca,
tales como printf o scanf.
Archivos de Datos Secuenciales
• Archivos sin formato: organiza los datos en bloques de bytes
contiguos de información. Estos bloques representan estructuras
de datos más complejas, como arrays y estructuras.

Hay un conjunto diferenciado de funciones de biblioteca para tratar


este tipo de archivos. Estas funciones proveen instrucciones simples
que pueden transferir arrays o estructuras completas a o desde un
archivo de datos.
Archivos Orientados al Sistema
• Están más relacionados con el sistema operativo de la
computadora que los archivos secuenciales. Es algo más
complicado trabajar con ellos, pero su uso puede ser más
eficiente para cierto tipo de aplicaciones.

Para procesar archivos orientados al sistema se requiere un


conjunto separado de procedimientos con sus funciones de
biblioteca correspondientes.
Apertura y Cierre de un Archivo
• Cuando se trabaja con archivos secuenciales, el primer paso:
– Establecer un área de buffer, donde la información se
almacena temporalmente mientras se está transfiriendo
entre la memoria de la computadora y el archivo de
datos.

– Este área de buffer permite leer y escribir información del


archivo más rápidamente de lo que sería posible de otra
manera.
Apertura y Cierre de un Archivo
• El área de búffer se establece escribiendo:
FILE *ptvar;
• FILE es un tipo especial de estructura que establece el área de
búffer. El tipo de estructura FILE está definido en la cabecera:
#include<stdio.h>

• ptvar es la variable puntero que indica el principio de este área. El


puntero ptvar se refiere a menudo como un puntero a archivo
secuencial, o simplemente como archivo secuencial.
Apertura y Cierre de un Archivo
• Un archivo debe ser abierto antes de ser procesado.
– Esto asocia el nombre del archivo con el área de búffer.
– También se especifica cómo se va a usar el archivo, sólo para lectura,
sólo para escritura, o para lectura/escritura.
• Para abrir un archivo se usa la función de biblioteca fopen. Esta función
se escribe típicamente como:
ptvar = fopen(nombre-archivo, tipo-archivo);

• Devuelve un puntero al principio del área de buffer asociada con el archivo. Se


devuelve un valor NULL si no se puede abrir el archivo, por ejemplo si no se puede
encontrar un archivo existente.
Apertura y Cierre de un Archivo
• Especificaciones de Tipo de Archivo
Tipo-archivo Significado
“r” Abrir un archivo existente sólo para lectura.
“w” Abrir un nuevo archivo sólo para escritura. Si existe un archivo con el
nombre-archivo especificado, será destruido y creado uno nuevo en su
lugar.
“a” Abrir un archivo existente para agregar información nueva al final del
archivo. Se creará un archivo nuevo si no existe un archivo con el
nombre-archivo especificado.
“r+” Abrir un archivo existente tanto para lectura como para escritura.
“w+” Abrir un archivo nuevo para lectura y escritura.
“a+” Abrir un archivo existente para leer y añadir.
Apertura y Cierre de un Archivo

Finalmente, un archivo de datos debe cerrarse al


final del programa. Esto puede realizarse con la
función de biblioteca fclose. La sintaxis es
simplemente:
fclose (ptvar)
Ejemplo1 - Apertura y Cierre de un Archivo

#include<stdio.h>

main ()
{
FILE *fpt;
fpt = fopen("muestra.dat", “r+");
if (fpt == 0)
printf("\nERROR - No se puede abrir el archivo indicado\n");
else
// ….
fclose(fpt);
getch();
}

ULSA- Lenguaje De
Programacion II
Ing. Carolina Robelo
CREACIÓN DE UN ARCHIVO SECUENCIAL
• Una vez abierto un archivo para escribir datos hay que grabar los datos en el
archivo.

• La biblioteca C proporciona diversas funciones para escribir datos en el


archivo a través del puntero a FILE asociado.

• Las funciones de entrada y de salida de archivos son muy parecidas con las
funciones utilizadas para entrada y salida por teclado y pantalla
– getchar ( ) , putchar ( ) , gets ( ) y puts ( )

Todas tienen una versión para archivos que empieza por la letra f.
CREACIÓN DE UN ARCHIVO SECUENCIAL
• Funciones putc () y fputc ()
Ambas funciones son idénticas, escriben un carácter en el archivo
asociado con el puntero a FILE. Devuelven el carácter escrito, o bien EOF
si no puede ser escrito.

El formato de llamada:
putc(c, puntero-archivo);
fputc(c, puntero-archivo);
Siendo c el caracter a escribir.
CREACIÓN DE UN ARCHIVO SECUENCIAL
• Ejemplo2: Funciones putc () y fputc ()
Leer una línea de texto en minúsculas y almacenarla en mayúsculas en un archivo
de datos. #include <stdio.h>
#include <ctype.h>
main()
{
FILE * fpt;
char c;
fpt = fopen("ejemplo.txt", "w");
if (fpt==0) printf("Error no se puede abrir");
else
do
{ c = getchar();
putc(toupper(c), fpt);

}while (c != '\n');
fclose(fpt);
getch();
}
CREACIÓN DE UN ARCHIVO SECUENCIAL
• Funciones getc() y fgetc()
Estas dos funciones son iguales, igual formato e igual funcionalidad;
pueden considerarse que son recíprocas de putc () y fputc ().

Éstas, getc () y fgetc () , leen un carácter del archivo asociado al


puntero a FILE. Devuelven el carácter leído o EOF si es fin de archivo
(o si ha habido un error).
El formato de llamada es:
getc (puntero-archivo) ;
fgetc(puntero-archivo);
CREACIÓN DE UN ARCHIVO SECUENCIAL
• Ejemplo3: Funciones getc() y fgetc ()
El siguiente programa lee una línea de texto de un archivo de datos, carácter a
carácter, y muestra el texto en la pantalla.
#include <stdio.h>
main ()
{
FILE *fpt;
char c;

fpt = fopen("ejemplo.dat", "r");


if (fpt == 0)
printf("\nERROR - No se puede abrir el archivo indicado\n");
else
do
putchar(c= getc(fpt));
while (c != '\n');
fclose(fpt);
getch();
}
Lectura y escritura de cadenas de caracteres
(líneas)
• fputs () sus argumentos son:
– El array de caracteres que queremos escribir. Se
escribirán secuencialmente todos los caracteres hasta
que se encuentre un fin de cadena \0
– La variable puntero del tipo FILE que creamos
• fgets () sus argumentos son:
– Un array de caracteres en el que se meterá la línea leída
del fichero.
– Tamaño del array de caracteres.
– La variable puntero del tipo FILE que creamos
Funciones fprintf () y fscanf ()

• Muchos archivos de datos contienen estructuras de datos que


incluyen combinaciones de información numérica y de carácter.
Tales archivos se pueden procesar usando las funciones de
biblioteca fscanf y fprintf, que son análogas a las funciones scanf y
printf.

• fscanf permite leer un dato con formato desde un archivo de datos


asociado con un archivo secuencial.
fscanf (var-puntero, formato, variable)
• fprintf permite escribir datos con formato en el archivo de datos.
Escribir en un Secuencial: Archivo de Texto

• Los registros en un archivo secuencial se agregan siempre al final.


• Primer paso: Abrir el archivo para escritura:
– En el modo “w” si queremos borrar lo que contuviera
anteriormente,
– En el modo “a” si deseamos conservar su información anterior.

Segundo: Se usan sucesivas instrucciones de escritura para


insertar los registros o los caracteres.

Los datos se grabarán en el archivo exactamente en el mismo


orden en el que los escribas.
Escribir en un Secuencial: Archivo de Texto

• Funciones de escritura:
– fputc(caracteres, ptarchivo)
– fputs(arreglo-caracteres, ptarchivo)
– fprintf(ptarchivo, “formato”, variable)

• Ejemplo: Crear un archivo de texto llamado ejemplo.txt Luego escribir en el


archivo 5 números enteros introducidos por el usuario. Cada vez que se
ejecute el programa, se añadirán otros 5 números al final del archivo.
Lectura de datos en un archivo secuencial

• Al abrir un archivo secuencial para lectura, internamente:


– El indicador de posición se sitúa en el primer byte del archivo.
– Cada vez que se lea un dato, el indicador de posición se
desplaza automáticamente tantos bytes adelante como se
hayan leído.
– Las lecturas se pueden continuar haciendo hasta que se alcance
el final del archivo.

Para leer desde un archivo, lo podemos hacer creando un bucle


while, la lectura se realiza hasta que se encuentre el final del
fichero.
Lectura de datos en un archivo secuencial
• La detección del final del fichero se puede llevar a cabo de dos
formas:
– Con la función feof: Esta función comprueba si se ha llegado al
final del archivo , en cuyo caso devuelve un valor distinto de 0.
Si no se ha llegado al final de fichero devuelve un 0.
while (feof(fichero) == 0) otra forma de escribirlo:
while (!feof(fichero))
– Comprobando si el valor del caracter es EOF (último caracter
de cualquier archivo). Consiste en comprobar si el carácter
leído es el de fin de fichero EOF while (letra != EOF )
Ejemplo de Lectura, usando fscanf

• Abrir el archivo del ejemplo anterior y escribir en la pantalla todos


los números que contenga.
Busqueda de Informacion
• En un archivo de texto el único método de búsqueda posible
es el secuencial, es decir, que hay que leer todos los registros,
partiendo del primero, hasta encontrar el que buscamos.

• Ejemplo: Utilizando el archivo ejemplos.txt, tratar de localizar


un numero introducido por el usuario.
#include<Stdio.h>
main() {
FILE *archivo;
Ejemplo de Busqueda Secuencial
int n_busq, n_leido, linea, encontrado;
archivo = fopen("ejemplo.txt", "r");
if (archivo == NULL)
printf("Error al abrir el archivo");
else
{ printf("Que numero desea buscar?"); scanf("%d", &n_busq);
linea = 0; encontrado = 0;
while (feof(archivo)==0)
{ linea++; fscanf(archivo, "%d\n", &n_leido);
if (n_leido == n_busq) {
encontrado = 1; printf("El numero esta en la
linea %d\n", linea);
break; }
}
if (encontrado == 0)
printf("Ese numero no esta en el archivo");

}
fclose(archivo);
getch();
}
Borrar Datos de un archivo de texto

• La forma mas sencilla de borrar datos en un archivo secuencial:


– Crear un segundo archivo secuencial y copiar en él todos los
registros del archivo original excepto el que se pretende borrar.
Después, se borra el archivo original y se renombra el archivo
nuevo con el nombre que tenía el original.

Para borrar un archivo se usa la funcion


– remove(“nombredelarchivo”)
Para renombrar un archivo se usa la funcion
– rename(“nombreanterior”, “nuevonombre”)
Ejemplo de Borrar Informacion
#include<Stdio.h>
main() {
FILE *ar_orig, *ar_nuevo;
int N, linea,eliminar;
ar_orig = fopen("ejemplo.txt", "r");
ar_nuevo = fopen("temporal", "w");
if ((ar_orig == NULL) || (ar_nuevo == NULL))
printf("Error al abrir los archivos");
else
{ linea = 0; printf("Que linea desea eliminar?"); scanf("%d", &eliminar);
while (feof(ar_orig)==0)
{
linea++;
fscanf(ar_orig, "%d\n", &N);
if (linea != eliminar) // La linea a eliminar no se escribe
fprintf(ar_nuevo, "%d\n", N);
}
printf("\nInformacion eliminada!!!\n");
}
fclose(ar_orig); fclose(ar_nuevo);
remove("ejemplo.txt"); //elimina un archivo
rename("temporal", "ejemplo.txt"); //cambiamos el nombre del archivo
getch();
}
Modificacion de Datos

• En los archivos secuenciales sólo puede escribirse al final del


archivo. Por lo tanto, para modificar un registro hay que actuar de
forma similar al método de borrado:

– Creando un segundo archivo en el que se copiarán todos los


registros exactamente igual que en el archivo original, excepto
el que se pretende cambiar.
Ejemplo de Modificar Informacion
#include<Stdio.h>
main() { FILE *ar_orig, *ar_nuevo; int N, linea,modificar,numero;
ar_orig = fopen("ejemplo.txt", "r"); ar_nuevo = fopen("temporal", "w");
if ((ar_orig == NULL) || (ar_nuevo == NULL))
printf("Error al abrir los archivos");
else
{ linea = 0;
printf("Que linea desea modificar?");
scanf("%d", &modificar);
while (feof(ar_orig)==0)
{ linea++;
fscanf(ar_orig, "%d\n", &N);
if (linea != modificar) // copiamos todo igual excepto la q se va a modificar
fprintf(ar_nuevo, "%d\n", N);
else{
printf("ingrese la informacion modificada\n"); scanf("%d", &numero);
fprintf(ar_nuevo,"%d\n", numero); }
}
printf("\nDatos Modificados!!!\n");
}
fclose(ar_orig); fclose(ar_nuevo);
remove("ejemplo.txt"); //elimina un archivo
rename("temporal", "ejemplo.txt"); //cambiamos el nombre del archivo
getch();
} ULSA- Lenguaje De
Programacion II
Ing. Carolina Robelo

Вам также может понравиться