Curso de CEl Rincón del C - www.elrincondelc.com

Escritura de Ficheros

[Anterior] [Siguiente] [Contenido]

Contenido

Introducción

En este capítulo vamos a completar la parte que nos faltaba en el anterior capítulo, escribir en un fichero.

Como en el capítulo anterior vamos a verlo con un ejemplo. En este ejemplo abrimos un fichero 'origen.txt' y lo copiamos en otro fichero 'destino.txt'. Además el fichero se muestra en pantalla. Las partes nuevas están marcadas en negrita para que se vea la diferencia:

#include <stdio.h>

int main()
    {
    FILE *origen, *destino;
    char letra;

    origen=fopen("origen.txt","r");
    destino=fopen("destino.txt","w");
    if (origen==NULL || destino==NULL)
       {
       printf( "Problemas con los ficheros.\n" );
       exit( 1 );
       }
    letra=getc(origen);
    while (feof(origen)==0)
          {
          putc(letra,destino);
          printf( "%c",letra );
          letra=getc(origen);
          }
    if (fclose(origen)!=0)
       printf( "Problemas al cerrar el fichero origen.txt\n" );
    if (fclose(destino)!=0)
       printf( "Problemas al cerrar el fichero destino.txt\n" );
    }
Comprobado con DJGPP

[Arriba]

Escritura de un fichero

El puntero FILE *

Como hemos visto en el capítulo anterior el puntero FILE es la base de la escritura/lectura de archivos. Por eso definimos dos punteros FILE:

Abrir el fichero - fopen

El siguiente paso, como antes, es abrir el fichero usando fopen. La diferencia es que ahora tenemos que abrirlo para escritura. Usamos el modo 'w' (crea el fichero o lo vacía si existe) porque queremos crear un fichero.

Recordemos que después de abrir un fichero hay que comprobar si la operación se ha realizado con éxito. En este caso, como es un sencillo ejemplo, los he comprobado ambos a la vez:

if (origen==NULL || destino==NULL)

pero es más correcto hacerlo por separado así sabemos dónde se está produciendo el posible fallo.

Por comodidad para el lector repito aquí la lista de modos posibles:

rAbre un fichero existente para lectura.
wCrea un fichero nuevo (o borra su contenido si existe) y lo abre para escritura.
aAbre un fichero (si no existe lo crea) para escritura. El puntero se sitúa al final del archivo, de forma que se puedan añadir datos si borrar los existentes.

y los modificadores eran:

bAbre el fichero en modo binario.
tAbre el fichero en modo texto.
+Abre el fichero para lectura y escritura.

[Arriba]

Lectura del origen y escritura en destino- getc y putc

Como se puede observar en el ejemplo la lectura del fichero se hace igual que lo que vimos en el capítulo anterior. Para la escritura usamos la función putc:

int putc(int c, FILE *fichero);

donde c contiene el carácter que queremos escribir en el fichero y el puntero fichero es el fichero sobre el que trabajamos.

De esta forma vamos escribiendo en el fichero destino.txt el contenido del fichero origen.txt.

Comprobar fin de fichero

Como siempre que leemos datos de un fichero debemos comprobar si hemos llegado al final. Sólo debemos comprobar si estamos al final del fichero que leemos. No tenemos que comprobar el final del fichero en el que escribimos puesto que lo estamos creando y aún no tiene final.

[Arriba]

Cerrar el fichero - fclose

Y por fin lo que nunca debemos olvidar al trabajar con ficheros: cerrarlos. Debemos cerrar tanto los ficheros que leemos como aquellos sobre los que escribimos.

[Arriba]

Escritura de líneas - fputs

La función fputs trabaja junto con la función fgets que vimos en el capítulo anterior:

int fputs(const char *cadena, FILE *fichero);

[Arriba]

Ejercicios

Ejercicio 1

Escribe un programa que lea un fichero y le suprima todas las vocales.

Es decir que siendo el fichero origen.txt:

El alegre campesino
pasea por el campo
ajeno a que el toro
se acerca por detrás

El fichero destino.txt sea:

l lgr cmpsn
ps pr l cmp
jn  q l tr
s crc pr dtrás

Ejercicio 2

La solución propuesta no elimina las vocales acentuadas, modifica el programa para conseguirlo.

Solución al ejercicio 1

#include <stdio.h>

int main()
    {
    FILE *origen, *destino;
    char letra;

    origen=fopen("origen.txt","r");
    destino=fopen("destino.txt","w");
    if (origen==NULL || destino==NULL)
       {
       printf( "Problemas con los ficheros.\n" );
       exit( 1 );
       }
    letra=getc(origen);
    while (feof(origen)==0)
          {
          if (!strchr("AEIOUaeiou",letra)) putc( letra, destino );
          letra=getc(origen);
          }
    if (fclose(origen)!=0)
       printf( "Problemas al cerrar el fichero origen.txt\n" );
    if (fclose(destino)!=0)
       printf( "Problemas al cerrar el fichero destino.txt\n" );
    }
Comprobado con DJGPP

Solución al ejercicio 2

Lo único que hay que hacer es añadir "áéíóúÁÉÍÓÚ" a la línea:

          if (!strchr("AEIOUaeiouáéíóúÁÉÍÓÚ",letra)) putc( letra, destino );

[Arriba]

[Anterior] [Siguiente] [Contenido]

© Gorka Urrutia

www.elrincondelc.com