¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Desarrollo informático
  3. Los archivos
Extrait - Desarrollo informático Aprenda a diseñar antes de programar
Extractos del libro
Desarrollo informático Aprenda a diseñar antes de programar Volver a la página de compra del libro

Los archivos

Objetivos del capítulo

  1. Almacenar de manera secuencial información en archivos binarios.

  2. Leer de manera secuencial un archivo binario.

  3. Acceder directamente a la información de un archivo binario.

  4. Leer y escribir en un archivo de texto.

  5. Entender la diferencia entre archivo de texto y archivo binario.

Los archivos en C

1. Presentación

En C, un archivo es una sucesión de bytes situados en una determinada dirección en un disco.

Esta definición es general para todos los archivos y define un archivo binario.

C prevé dos tipos de archivos: texto o binario.

Un archivo de texto es un archivo binario interpretable por un editor de texto.

Trabajar con un archivo hace necesario:

  • Declarar un puntero a una variable (un conjunto de datos) de tipo FILE.

  • Abrir el archivo: asignación del puntero, dirección del archivo o más exactamente dirección de un conjunto de datos de tipo FILE, que contiene toda la información del archivo.

  • Utilizar el archivo: lectura, escritura.

  • Cerrar el archivo.

2. Lectura y escritura

  1. Lectura: transferencia de datos del disco a la memoria.

  2. Escritura: transferencia de datos de la memoria al disco.

images/108-1.png

3. Opciones de apertura de un archivo

Cuando se abre un archivo en lenguaje C, es posible indicar si se trata:

  • De un archivo de texto (t).

  • De un archivo binario (b).

También es posible indicar las acciones que queremos hacer:

  • Leer el archivo (r: read).

  • Crear el archivo y escribir en él (w: write).

  • Añadir información al final del archivo (a: append).

  • Realizar actualizaciones del archivo (r+).

  • Crear el archivo y autorizar las actualizaciones (w+).

  • Añadir información al final del archivo y autorizar las actualizaciones (a+).

Ejemplo

La llamada a la función...

Creación de un archivo binario nuevo: escritura secuencial

El siguiente programa permite crear un archivo llamado «estudiantes», que contiene una sucesión de registros de tipo ESTUDIANTE.

1. Estructura de los registros

typedef struct   {      int numero;      char nombre[51];   } ESTUDIANTE; 

2. Programa de creación del archivo

  • archivo: puntero al archivo.

  • s: variable destinada a la escritura en el archivo.

  • codigoRetorno: entero destinado a comprobar el código de retorno de las funciones relacionadas con el archivo.

  • fila: cadena para los valores introducidos por el teclado.

int main()  
{  
   FILE* archivo;  
   ESTUDIANTE s;  
   int codigoRetorno;  
   char fila[81]; 

fopen(): apertura del archivo binario (b) estudiantes en modo escritura (w). Sin embargo, el puntero archivo conoce la dirección del archivo donde hay que escribir. Si la función fopen() devuelve 0, la apertura ha fallado.

    archivo = fopen("C:\\C\\archivos\\estudiantes", "wb");  
   if (archivo == 0)  
   {  
       printf(" *** Error de apertura del archivo estudiantes ***\n");  
       exit(0);  
   } 

Atención...

Lectura secuencial de un archivo binario y escritura en un archivo de texto

El siguiente programa permite leer el archivo «estudiantes» y escribir la información de cada registro en un archivo de texto.

1. Estructura de los registros

typedef struct  
{  
   int numero;  
   char nombre[51];  
} ESTUDIANTE; 

2. Programa de lectura del archivo

  • archivo: puntero al archivo que se debe leer («estudiantes»);

  • edicion: puntero al archivo de texto de edición;

  • s: variable destinada a la lectura del archivo «estudiantes».

int main()  
{  
   FILE* archivo;  
   FILE* edicion;  
   ESTUDIANTE s; 

La continuación del programa muestra la apertura del archivo binario (b) estudiantes en modo lectura (r) y la apertura del archivo de texto (t) en modo escritura (w).

   archivo = fopen("C:\\C\\archivos\\estudiantes", "rb");  
   if (archivo == 0)  
   {  
       printf(" *** Error de apertura del archivo estudiantes ***");
       exit(0);  
   }  
  
   edicion = fopen("C:\\C\\archivos\\editEstudiantes.txt", "wt");  
   if (edicion == 0)  
   {  ...

Añadir una tabla de registros al archivo binario

Añade una tabla de registros al archivo «estudiantes».

tabStag es una tabla con tres variables de tipo ESTUDIANTE:

int main()  
{  
   FILE* archivo;  
   ESTUDIANTE tabStag[3];  
   int codigoRetorno; 

La continuación del programa muestra la apertura del archivo binario (b) «estudiantes» en modo adición (a). La «cabeza de escritura» se posiciona automáticamente al final del archivo.

   archivo = fopen("C:\\C\\archivos\\estudiantes", "ab");  
   if (archivo == 0)  
   {  
       printf(" *** Error de apertura del archivo estudiante ***\n");
       exit(0);  
   }  
  
   tabStag[0].numero = 150;  
   strcpy(tabStag[0].nombre, "PERDIZ");  
   tabStag[1].numero = 151;  
   strcpy(tabStag[1].nombre, "CAMACHUELO");  
   tabStag[2].numero = 152;  
   strcpy(tabStag[2].nombre, "TREPARRISCOS"); 

La escritura de la tabla en el archivo se realiza con la instrucción fwrite(), que añade tres registros ESTUDIANTE en el archivo. El tercer argumento es el número...

Lectura directa y actualización de un archivo binario

El siguiente programa permite modificar los registros del archivo "estudiantes".

1. Programa de modificación del archivo

numReg: número del registro que hay que modificar.

int main()  
{  
   FILE* archivo;  
   ESTUDIANTE s;    
   int codigoRetorno;  
   char fila[81];  
   int numReg; 

Apertura del archivo binario (b) estudiantes en modo modificación (r+).

   archivo = fopen("C:\\C\\archivos\\estudiantes", "r+b");  
   if (archivo == 0)  
   {  
       printf(" *** Error de apertura del archivo estudiantes ***");
       exit(0);  
   } 

Introducir el número del registro que se ha de modificar:

   printf("Numero de registro a modificar: ");  
   gets(fila); 

Mientras se introduzca un número vacío, se ejecuta el bucle de modificación:

   while (fila[0]!= 0)  
   {  
       numReg = atoi(fila); 

fseek(): esta función posiciona la cabeza de lectura/escritura en el archivo.

Esta posición se calcula a partir del inicio del archivo: opción SEEK_SET.

El número...

Diferencias de codificación entre un archivo binario y un archivo de texto

Este programa escribe la misma variable i en un archivo binario y en un archivo de texto.

  • binario: puntero a un archivo binario;

  • texto: puntero a un archivo de texto;

  • i: entero que se va a escribir en los dos archivos.

int main()   
{ 
   FILE* binario;   
   FILE* texto;   
   int i;    
  
   binario = fopen("C:\\C\\archivos\\binario", "wb");   
   if (binario == 0)       
   {   
       . . .   
   }   
   texto = fopen("C:\\C\\archivos\\texto", "wt");  
   if (texto == 0)   
   {   
       . . .   
   }   
   i = 17; 

La siguiente instrucción escribe el valor del entero 17 en el archivo binario. Un entero son cuatro bytes. El primero de los cuatro bytes contiene 17 (11 en hexadecimal), los otros tres contienen 00.

   fwrite(&i, sizeof(int), 1, binario); 

La siguiente instrucción convierte el entero i en caracteres: el carácter ‘1’ y el carácter ‘7’, y los escribe en el archivo de texto. 31 y 37 son los códigos ASCII en hexadecimal de los caracteres...

Trabajo práctico: archivo de los empleados

1. Tema

a. Ejercicio 1

Crear un archivo de los empleados.

La estructura EMPLEADO tiene la siguiente forma:

typedef struct  
{  
   int numero;  
   char nombre[51];  
   char apellido[41];  
   int nombreCiudad;  
} EMPLEADO; 

Hacer un bucle para introducir el número y los otros tres campos.

A continuación se muestra el resultado esperado durante la ejecución de este programa: 

images/108-10.png

b. Ejercicio 2

Leer el archivo, mostrar los empleados.

c. Ejercicio 3

Leer el archivo, mostrar los empleados con el nombre de la agencia.

A continuación se muestra el resultado esperado durante la ejecución de este programa: 

images/p178.png

d. Anexo 1: función buscarCiudad(), archivo Ciudades.h

La función buscarCiudad() permite encontrar el número de registro, en el archivo de las Ciudades («Ciudades»), de una Ciudad cuyo número de identificación conocemos.

El prototipo de esta función se encuentra en el archivo: Ciudades.h.

images/108-12.png

El código binario de esta función se encuentra en: Ciudades.o

images/108-13.png

El archivo «Ciudades» se encuentra en el directorio C:\C\archivos.

El número de registro devuelto por la función buscarCiudad() permite recuperar el nombre de la Ciudad.

Mostrar: «Ciudad desconocida» si el número de Ciudad no existe en el archivo.

A continuación se muestra el contenido del archivo Ciudades.h:

typedef struct  
{  
  int numero;  
  char nombre[81];  
} CIUDAD; 

La función buscarCiudad() devuelve el número del registro correspondiente a nombreCiudad o -1 si nombreCiudad no existe en el archivo:

int buscarCiudad(int nombreCiudad, FILE* archivoCiudades); 

El código fuente de la función buscarCiudad y el programa de creación del archivo de las Ciudades están disponibles en los proyectos biblCiudades y creacionCiudades desde la página Información.

e. Anexo 2: lista de las Ciudades

A continuación se muestra la lista de las Ciudades contenidas en el archivo Ciudades:

images/108-14.png

2. Archivo de los empleados: proposición de corrección

a. Ejercicio...