Está en la página 1de 8

Manejo de ficheros en C

C ofrece un conjunto de funciones que permiten leer y


escribir cualquier tipo de archivo. Todas estas funciones
están incluidas en el archivo stdio.h. Hay que tener en cuenta,
que para poder manipular un fichero, este se debe abrir y
tras terminar de trabajar con él, este se debe cerrar.

Para trabajar con ficheros existe un nuevo tipo de dato, FILE


*, el cual es un puntero que señala al archivo como tal.

Abrir y cerrar un archivo

La función fopen() permite abrir un archivo. Retorna un


puntero a FILE. Si falla, retorna NULL. La función recibe dos
parámetros, el primero es una cadena de caracteres que
corresponde al nombre del archivo, incluido su extensión. El
segundo parámetro es el modo en que se abrirá el archivo.

Mod
o
r lectura. Si el archivo no existe retorna NULL.
lectura-escritura. Si el archivo no existe, lo crea. Si existe, lo
r+
sobreescribe al inicio.
escritura. Si el archivo no existe, lo crea. Si existe, lo
w
sobreescribe.
lectura-escritura. Si el archivo no existe, lo crea. Si existe,
w+
sobreescribe todo el fichero.
adición. Si el archivo no existe, lo crea. Si existe, añade la
a
nueva información al final.

1
lectura-adición. Si el archivo no existe, lo crea. Si existe, se
a+
añade al final.

Por defecto, el modo corresponde a archivos de texto. Para


archivos binarios se añade una "b" (e.g., "rb" : modo de
lectura para archivos binarios).

Además, debido a que C no tiene construcciones para el


manejo de excepciones o errores, siempre hay que evaluar
la apertura del archivo.

Siempre que se termine de manipular un archivo, este se


debe cerrar. La función fclose() permite cerrar un fichero que
ha sido abierto. Retorna 0 cuando cierra el archivo
correctamente y retorna EOF si ha ocurrido algún error. El
único parámetro que recibe es un puntero a tipo FILE.

//abrir un archivo.
#include <stdio.h>

void main(){
FILE *archivo;
archivo = fopen("fichero.txt", "r");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

... manipulación del archivo ...

fclose(archivo);
}

Lectura de archivos

La función fgetc() lee un carácter a la vez del archivo. Recibe


como parámetro un puntero a tipo FILE. Si la lectura es
exitosa retorna el carácter leído. Si no puede leer o si el
cursor está al final del archivo, retorna EOF.

//lectura de fichero utilizando fgetc().


#include <stdio.h>

void main(){

2
FILE *archivo;
char caracter;

archivo = fopen("fichero.txt", "r");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

while ((caracter = fgetc(archivo)) != EOF)


printf("%c",caracter);

fclose(archivo);
}

La función fgets() permite leer cadenas de caracteres. Recibe


un arreglo de caracteres donde almacenar la información, el
tamaño del arreglo y un puntero a tipo FILE. Lee hasta n-1
caracteres o hasta hallar un carácter de nueva línea o hasta
llegar al final del archivo.

//lectura de fichero utilizando fgets().


#include <stdio.h>

void main(){
FILE *archivo;
char linea[80];

archivo = fopen("fichero.txt", "r");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

while (feof(archivo) == 0){


fgets(linea, 80, archivo);
printf("%s",linea);
}

fclose(archivo);
}

La función fscanf() trabaja de forma similar que scanf(), pero la


entrada la toma de un fichero, en lugar del teclado. Recibe
como parámetros un puntero a tipo FILE, una cadena de
formato y un arreglo de caracteres.

//lectura de fichero utilizando fscanf().


#include <stdio.h>

3
void main(){
FILE *archivo;
char buffer[80];

archivo = fopen("fichero.txt", "r");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

fscanf(archivo, "%s", buffer);


printf("%s",buffer);

fclose(archivo);
}

Escritura de archivos

La función fputc() escribe un carácter en un archivo, retorna


el carácter escrito o EOF en caso de algún error. Recibe como
parámetros un carácter y un puntero a tipo FILE.

//escribe texto hasta que se presiona Enter.


#include <stdio.h>

void main(){
FILE *archivo;
char caracter;

archivo = fopen("fichero.txt", "a+");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

puts("Agrega texto al fichero. Para terminar presiona Enter");


while ((caracter = getchar()) != '\n')
printf("%c", fputc(caracter, archivo));

fclose(archivo);
}

La función fputs() permite escribir una cadena de caracteres


en un fichero, retorna un número no negativo o EOF en caso
de algún error. Recibe como parámetros un arreglo de
caracteres y un puntero a tipo FILE.

//añade una cadena de texto al archivo utilizando fputs().


#include <stdio.h>

4
void main(){
FILE *archivo;
char cadena[] = "\nAutor: Andres Ruiz.\nFecha: 1/04/2020";

archivo = fopen("fichero.txt", "a+");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

fputs(cadena, archivo);

fclose(archivo);
}

La función fprintf() trabaja de forma similar que printf(), pero la


salida se dirige a un archivo en lugar de la pantalla. Recibe
como parámetros un puntero a tipo FILE y una cadena de
texto que puede contener especificadores de formato junto
con sus respectivas variables.

//añade una cadena de texto al archivo usando fprintf().


#include <stdio.h>

void main(){
FILE *archivo;
char cadena[] = "\nAutor: Andres Ruiz.";

archivo = fopen("fichero.txt", "a+");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

fprintf(archivo, cadena);
//también: fprintf(archivo, "%s", "\nAutor: Andres Ruiz.");

fclose(archivo);
}

Funciones para el cursor de lectura – escritura

La función feof() recibe como parámetro un puntero a tipo FILE


y determina si el cursor dentro del archivo encontró el final
(end of file – EOF). Retorna 0 si no encuentra EOF en el
archivo, de lo contrario regresa un valor distinto a 0.

5
La función rewind() situa el cursor al principio del archivo.
Recibe como único parámetro un puntero a tipo FILE.

La función fseek() permite situar el cursor en la posición


deseada. Recibe como parámetros un puntero a tipo FILE, un
número que indica el desplazamiento en bytes y un modo
que puede tomar tres valores distintos:

 SEEK_SET: el cursor se desplaza desde el principio del


archivo.
 SEEK_CUR: el cursor se desplaza desde la posición
actual.
 SEEK_END: el cursor se desplaza desde el final del
fichero.

En cambio, la función ftell() retorna la posición actual dentro


del fichero. Recibe como único parámetro un puntero a tipo
FILE. De esta manera, el valor devuelto por ftell() puede ser
usado por fseek() para volver a la posición actual.

Leer cualquier tipo de dato

Las funciones anteriores solo permiten trabajar con


caracteres y cadenas de caracteres. Para trabajar con datos
de cualquier tipo, incluso estructuras, se utilizan las
funciones fread() y fwrite().

La función fwrite() permite escribir datos en forma binaria en


un fichero (solo el texto se mantiene igual). Recibe como
primer parámetro la dirección de la variable que contiene los
datos que se van a escribir en el archivo, el tamaño del tipo
de dato a escribir, el número de datos a escribir y por último,
un puntero a tipo FILE. Esta función agrega todos los datos
seguidos en la misma línea, sin añadir un salto de línea al
final.

//escribe 8 números dentro del archivo de forma binaria.

6
#include <stdio.h>

void main(){
FILE *archivo;
int temperaturas[8] = {17, 19, 14, 15, 23, 20, 21, 17};

archivo = fopen("fichero.txt", "a+");


if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

fwrite(temperaturas, sizeof(int), 8, archivo);


fclose(archivo);
}

//escribe datos de una estructura en un archivo.


//fwrite() escribe todos los datos en la misma línea.
#include <stdio.h>

struct datos{
char nombre[20];
char apellido[20];
char codigo[4];
}registro;

void main(){
FILE *archivo;
archivo = fopen("prueba.txt", "w+");

if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}
for (int i=0; i<2; i++){
printf("\nNombre: ");
gets(registro.nombre);

printf("Apellido: ");
gets(registro.apellido);

printf("Codigo: ");
gets(registro.codigo);

fwrite(&registro, sizeof(struct datos), 1, archivo);


fprintf(archivo, "\n");
}
fclose(archivo);
}

Para recuperar la información guardada en forma binaria,


hay que recurrir a la función fread(), toma como parámetros
una variable donde guardar los datos leídos del fichero, el

7
tamaño del tipo de dato a leer, el número de datos a leer y
por último, un puntero a tipo FILE.

//lee numeros binarios dentro del archivo.


#include <stdio.h>

void main(){
FILE *archivo;
int datos_leidos[8];

archivo = fopen("fichero.txt", "r+");


if (archivo == NULL){
perror("Error al intentar abrir el archivo");
exit(1);
}

fread(datos_leidos, sizeof(int), 8, archivo);

for (int i=0; i<8; i++)


printf("%d ", datos_leidos[i]);

fclose(archivo);
}

Otras funciones útiles para manejar ficheros

La función remove() permite eliminar un archivo específico.


Acepta como parámetro una cadena de texto que
corresponde al nombre del fichero.

La función rename() permite cambiar el nombre de un archivo.


El primer parámetro corresponde al nombre actual del
fichero, mientras que el segundo parámetro es una cadena
de texto que indica el nuevo nombre.

También podría gustarte