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" ); }
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:
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:
r | Abre un fichero existente para lectura. |
w | Crea un fichero nuevo (o borra su contenido si existe) y lo abre para escritura. |
a | Abre 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:
b | Abre el fichero en modo binario. |
t | Abre el fichero en modo texto. |
+ | Abre el fichero para lectura y escritura. |
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.
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.
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.
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);
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
La solución propuesta no elimina las vocales acentuadas, modifica el programa para conseguirlo.
#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" ); }
Lo único que hay que hacer es añadir "áéíóúÁÉÍÓÚ" a la línea:
if (!strchr("AEIOUaeiouáéíóúÁÉÍÓÚ",letra)) putc( letra, destino );