Abrir, crear y cerrar un fichero en C

En este artículo voy a explicar cómo se abre un fichero desde un programa en C. En artículos posteriores explicaré como leer el contenido de un fichero y cómo escribirlo.

Así pues, te hago un pregunta: ¿Sabes lo que es un un fichero? Seguramente dirás que si, pero ¿y si te piden que des una explicación de lo que es? Ahí... parece que se complica la cosa. En los siguientes párrafos voy a intentar explicar cómo funciona esto de los ficheros en un sistema. Un fichero es un conjunto de datos que se almacenan en un soporte como pudiera ser un disco duro o un soporte externo como un USB, CD-ROM, etc. A estos ficheros se le ponen nombres para que los podamos identificar, por ejemplo, telefonos.txt o empleados.dat. Y ¿qué podemos almacenar en un fichero? Podemos almacenar datos de muchos tipos primitivos como int, char, float, pero también cadenas de caracteres o estructuras. Al final, a mas bajo nivel lo que estamos almacenando de un modo u otro son ceros y unos (011010100110...)

Para explicar todo el proceso con ejemplos vamos a utilizar el lenguaje de programación C, y algunas de sus funciones para el caso. Todas las funciones que necesitaremos para poder abrir, crear, acceder a su contenido, modificar y cerrar, pertenecen a la biblioteca stdio de C, así que podremos usarlas indicando la siguiente directiva al inicio de nuestros programas.

#include <stdio.h>

Comencemos pues. Imagina lo que le puede costar a una computadora encontrar un fichero en concreto de entre centenares de miles de ficheros que hay almacenados. Quizás podríamos pensar que solo tiene que recorrer uno a uno hasta dar con el que quiere, pero claro, este puede estar en cualquier lugar, e incluso el último de una lista enorme de ficheros. Para ello, las computadoras tienen una tabla donde existe una relación entre el nombre de un fichero y la dirección o lugar en la que se encuentra dentro del disco duro. Así pues, cuando abramos un fichero desde un programa C, en realidad lo que hacemos es obtener esa dirección y utilizarla para realizar diferentes operaciones. Aquí podemos ver un ejemplo:

Nombre del fichero Dirección del puntero
archivo1.txt 0x7fff7ad1f070
archivo2.txt 0x7fff7ad1f108
archivo3.txt 0x7fff7ad1f1a0
\vdots \vdots

fopen

Ahora que ya sabemos lo que es un fichero y cómo se almacena podemos ver qué es lo que hay que hacer para crear un fichero nuevo o abrir uno existente. Para ello utilizaremos la función fopen, que nos devolverá la dirección del fichero, un puntero a FILE. La sintaxis general es:

fopen(nombre, modo);

Donde nombre puede ser una cadena con el nombre del fichero o la ruta absoluta (por ejemplo: /var/tmp/archivo1.txt). Y el parámetro modo es una cadena que contiene una serie de caracteres que indican cómo queremos que se abra o se cree el fichero. En la siguiente tabla se indican las distintas posibilidades y su significado:

Modo Descripción
r (read) Si el fichero existe se abre en modo solo lectura y, por defecto, en modo texto.Si el fichero no existe la función devuelve NULL. Se utiliza para leer los datos de un fichero en modo texto.
w (write) Si el fichero no existe lo crea para escribir en él y lo deja abierto, por defecto, en modo texto, y si ya existe lo sobrescribe. Todas las operaciones de escritura con el modo 'w' se realizan al final del fichero.
a (add) Si el fichero no existe lo crea para escribir en él y lo deja abierto, por defecto, en modo texto, y si ya existe permite añadir mas datos al final de este respetando sus datos anteriores.
r+ Este modo es igual que el modo 'r' pero  también permite escribir en cualquier punto del fichero. Se utiliza para leer y modificar los datos de un fichero en modo texto.
w+ Igual que 'w' pero también permite leer del fichero. Se utiliza para crear un fichero y poder realizar operaciones de lectura.
a+ Igual que 'a' pero pero también permite leer del fichero. Se utiliza para añadir datos a un fichero en modo texto y poder realizar operaciones de lectura.
rt Igual que 'r'. la 't' es de texto.
wt Igual que 'w'. la 't' es de texto.
at Igual que 'a'. la 't' es de texto.
rt+ Igual que 'r+'.
wt+ Igual que 'w+'.
at+ Igual que 'a+'.
rb Igual que 'r' pero en modo binario, en vez de en modo texto. La 'b' es de binario.
wb Igual que 'w' pero en modo binario, en vez de en modo texto. La 'b' es de binario.
ab Igual que 'a' pero en modo binario, en vez de en modo texto. La 'b' es de binario.
rb+ Igual que 'r+' pero en modo binario, en vez de en modo texto. La 'b' es de binario.
wb+ Igual que 'w+' pero en modo binario, en vez de en modo texto. La 'b' es de binario.
ab+ Igual que 'a+' pero en modo binario, en vez de en modo texto. La 'b' es de binario.

Por ejemplo, si queremos abrir un archivo archivo1.txt y ver su contenido, debemos empezar por escribir lo siguiente:

fopen("archivo1.txt", "rt");

Antes he explicado que esto nos devuelve la dirección del fichero en un formato hexadecimal (0x7fff7ad1f070), así pues, dicha dirección la almacenaremos en una variable puntero a FILE, por ejemplo la llamaremos fichero.

#include <stdio.h>

int main(void) {

	/* Declaramos la variable fichero como puntero a FILE. */
	FILE *fichero;

	/* Abrimos fichero1.txt en modo texto y
	 * guardamos su direccion en el puntero. */
	fichero = fopen("fichero1.txt", "rt");

	/* Imprimimos la direccion para este ejemplo. */
	printf("%p\n",fichero);
}

Con este pequeño fragmento de código, cualquier operación que hubiésemos realizado con la variable fichero la estaríamos realizando con el archivo fichero1.txt.

Otro ejemplo, si queremos crear un nuevo fichero binario llamado empleados.dat escribimos el siguiente código:

#include <stdio.h>

int main(void) {

	/* Declaramos la variable fichero como puntero a FILE. */
	FILE *fichero;

	/* Creamos empleados.dat en modo binario y
	 * guardamos su direccion en el puntero. */
	fichero = fopen("empleados.dat", "wb");

	/* Imprimimos la direccion para este ejemplo. */
	printf("%p\n",fichero);
}

fclose

Hasta ahora solo hemos abierto ficheros nuevos o existentes, y no hemos hecho ninguna operación con ellos. Es muy importante cerrar un fichero una vez hemos terminado de trabajar con él, para ello existe la función fclose, que tiene la siguiente sintaxis:

fclose(puntero);

Donde puntero es el identificador de la variable puntero a FILE que almacena la dirección del fichero abierto. Vamos a ver el ejemplo anterior cerrando el fichero:

#include <stdio.h>

int main(void) {

	/* Declaramos la variable fichero como puntero a FILE. */
	FILE *fichero;

	/* Abrimos "fichero1.txt" en modo texto y
	 * guardamos su direccion en el puntero. */
	fichero = fopen("fichero1.txt", "rt");

	/* Imprimimos la direccion para este ejemplo. */
	printf("%p\n",fichero);

	/* Cerramos "fichero1.txt". */
	fclose(fichero);
}

Si el archivo fichero1.txt no existiera, la función fopen devolverá un valor NULL, y no podremos cerrarlo, puesto que no existe. Así que vamos a añadir un control  que detecte si el fichero existe o no, de modo que solo lo cerraremos si el valor del puntero es distinto de NULL.

#include <stdio.h>

int main(void) {

	/* Declaramos la variable fichero como puntero a FILE. */
	FILE *fichero;

	/* Abrimos "fichero1.txt" en modo texto y
	 * guardamos su direccion en el puntero. */
	fichero = fopen("fichero1.txt", "rt");

	if(fichero == NULL) {
		/* Imprimimos un mensaje para indicar que no existe. */
		printf("El fichero no se ha podido abrir, no existe.");
	} else {
		/* Imprimimos mesaje de exito y la direccion para este ejemplo. */
		printf("El fichero existe y esta en la direccion: %p\n",fichero);

		/* Cerramos "fichero1.txt". */
		fclose(fichero);
	}
}

En el próximo artículo explicaré cómo escribir dentro de un archivo en C.

4 opiniones en “Abrir, crear y cerrar un fichero en C”

  1. Your style is very unique compared to other folks I have
    read stuff from. I appreciate you for posting when you've
    got the opportunity, Guess I will just book mark this web site.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.