Logo DIE

Lectura y Escritura de Datos

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


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. Por lo tanto, los archivos de datos nos permiten almacenar información de modo permanente y acceder y modificar la misma cuando sea necesario.

En C existe un conjunto amplio de funciones de biblioteca para crear y procesar archivos de datos.



Elaborar programas en lenguaje C que requieran el uso de archivos de texto plano como un elemento de almacenamiento secundario para la resolución de problemas.

Archivos




Esquema



Lenguaje C permite manejar la entrada y la salida de datos desde o hacia un archivo, respectivamente, a través del uso de la biblioteca de funciones de la cabecera stdio.h.

Cuando se trabaja con archivos, el primer paso es 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. Esta área de buffer permite leer y escribir información del archivo más rápidamente de lo que sería posible de otra manera.

El área de buffer se establece escribiendo:

Esquema



Un apuntador a archivo señala a la información que contiene y define ciertas características sobre él, incluyendo el nombre, el estado y la posición actual del archivo.

Abrir archivos

Un archivo debe ser abierto antes de ser procesado. Esto asocia el nombre del archivo con el área de buffer (o apuntador). También se especifica cómo se va a usar el archivo, sólo para lectura, sólo para escritura o para lectura/escritura, en el que se permiten ambas operaciones.

Para abrir un archivo se usa la función de biblioteca fopen.

Esquema



Existen diferentes modos de apertura de archivos, los cuales se mencionan a continuación, además de que se puede utilizar más de uno.

Esquema



La función fopen devuelve un apuntador 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.



Cerrar archivos


Finalmente, un archivo de datos debe cerrarse al final del programa. Esto puede realizarse con la función de biblioteca fclose.

Esta función realiza un cierre formal del archivo a nivel del sistema operativo.

Un error en el cierre de una secuencia puede generar todo tipo de problemas, incluyendo la pérdida de datos, destrucción de archivos y posibles errores intermitentes en el programa.



La firma de esta función es…

Esquema



Es una buena práctica de programación cerrar explícitamente los archivos de datos mediante la función fclose, aunque la mayoría de los compiladores de C cerrarán automáticamente los archivos de datos al final de la ejecución.

Código (abrir y cerrar archivo)



Esquema




Lectura y escritura en archivos


Un archivo debe crearse antes de ser procesado. Este puede crearse de dos formas distintas:

1

Creando el archivo directamente, usando un procesador de texto o un editor.

2

Escribiendo un programa que introduzca información en la computadora y la escriba en un archivo.

Cuando se crea un nuevo archivo con uno de estos programas, el enfoque normal es introducir la información desde el teclado y escribirla en el archivo.

Un archivo creado de esta manera puede ser visualizado de distintas formas; por ejemplo:



Esquema

Este último programa sería, en algún sentido, una imagen especular del descrito anteriormente. Aunque es una forma más complicada de visualizar un archivo, ofrece gran flexibilidad, ya que los elementos individuales pueden procesarse según se leen.

Para poder recorrer todo el archivo generalmente se utilizan ciclos en los que se va leyendo línea por línea o dato por dato hasta llegar al final del archivo. Para saber que se ha llegado al final del archivo (End Of File, EOF) se usa la función feof.

La función feof siempre devolverá cero (falso) si no es encontrado EOF en el archivo; de lo contrario, regresará un valor distinto de cero (verdadero).

Funciones fgets y fputs


Los archivos de datos que contienen sólo cadenas de caracteres pueden crearse y leerse más fácilmente con programas que utilizan funciones de biblioteca, especialmente orientadas para cadenas de caracteres. Las funciones fgets y fputs pueden leer y escribir, respectivamente, cadenas sobre los archivos. Las firmas de estas funciones son, respectivamente:

fgets

char*fgets(char*buffer, int tamaño, FILE-apArch);

Esta función permite leer una cadena desde el archivo especificado. Lee un renglón a la vez.

fputs

char*fputs(char*buffer, FILE-apArch);

Función que permite escribir una cadena en un archivo específico.

Código (fgets)

Esquema



Código (fputs)

Esquema

Funciones fscanf y fprintf


Muchos archivos de datos contienen estructuras de datos más complicadas, tales como registros 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.

Esquema

Las especificaciones de formato son las mismas que se usan con las funciones printf y scanf, solamente hay que agregar el apuntador al archivo a utilizar.



Código (fscanf)



Esquema



Código (fprintf)



Esquema

Funciones fread y fwrite


fread y fwrite son funciones que permiten trabajar con elementos de longitud conocida.

fread permite leer uno o varios elementos de la misma longitud, a partir de una dirección de memoria determinada (apuntador).

El valor de retorno es el número de elementos (bytes) leídos. Su sintaxis es la siguiente:

int fread(void *ap, size_t tam, size_t nelem, FILE *archivo)

fwrite permite escribir hacia un archivo uno o varios elementos de la misma longitud almacenados a partir de una dirección de memoria determinada.

El valor de retorno es el número de elementos escritos. Su sintaxis es la siguiente:

int fwrite(void *ap, size_t tam, size_t nelem, FILE *archivo)



Código (fread)



Esquema



Código (fwrite)



Esquema
ícono

Actividad 1. Bloques de 10 en 10

Vamos a poner a prueba lo aprendido con un programa que escriba en un archivo llamado números.txt los números del 1 al 100 en bloques de 10 (por cada renglón) y separados entre ellos por un guion; es decir:

1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20
21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 – 30



ícono

Actividad 2. Convertir a mayúsculas

Ahora vas a procesar un archivo de texto (existente), el cual será leído por tu programa y convertirás su contenido a mayúsculas para posteriormente guardarlo en otro archivo. Ambos nombres de archivos (original y el generado) serán pasados por línea de comandos.

Tip: Para convertir a mayúsculas se utiliza la función toupper de la biblioteca ctype.h, la cual convierte el carácter pasado como argumento a mayúscula y lo devuelve.



ícono

Autoevaluación. Lectura y escritura de archivos

Para lograr la persistencia de datos los lenguajes de programación permiten el manejo de archivos. La información que se guarda en los archivos puede ser accedida y modificada en cualquier momento, incluso por otros programas, y así extender la funcionalidad del software creado.


Fuentes de información

Solano, J., García, E., Sandoval, L., Nakayama, A., Arteaga, I. y Castañeda, M. (2016). Manual de prácticas del laboratorio de Fundamentos de programación. Facultad de Ingeniería. Consultado de http://lcp02.fi-b.unam.mx



Cómo citar


Arteaga, T. I. y Nakayama, M. A. (2018). Lectura y escritura de datos. Unidades de Apoyo para el Aprendizaje. CUAED/Facultad de Ingeniería-UNAM. Consultado el (fecha) de (vínculo)