Ficheros de texto c
En primer lugar haremos una copia del fichero, usando las funciones fgets() y fputs().
Después algún ejemplo simple y otro algo más complicado de uso de la función fscanf(), para ver que tiene más posibilidades de las que habitualmente aparecen en los libros de iniciación.
Funciones fgets() y fputs()
Vamos a hacer una copia de un fichero de texto. Aunque podemoscopiarlo con el mismo programa que hicimos en el ejemplo de fichero binario, puesto que un fichero de texto no es más que un caso particular de fichero binario, vamos a hacerlo aquí de otra forma, específica para ficheros de texto. Esto nos servirá de excusa para presentar las funciones fgets() y fputs().
Lo primero, como siempre, será abrir los dos ficheros. El original como fichero de lectura y lacopia como fichero de escritura.
#include
...
FILE *f = fopen("fichero.txt", "r");
FILE *f2 = fopen("fichero2.txt", "w");
if (f==NULL)
{
perror ("Error al abrir fichero.txt");
return -1;
}
if (f2==NULL)
{
perror ("Error al abrir fichero2.txt");
return -1;
}
Una de las posibles funciones que tenemos para leer un fichero de texto es fgets(). Esta función lee una líneacompleta del fichero de texto y nos la devuelve.
Tiene los siguientes parámetros:
• char *s: Un array de caracteres en el que se meterá la línea leída del fichero. Este array debe tener tamaño suficiente para la línea o tendremos problemas.
• int n: Tamaño del array de caracteres. Si la línea es más larga, sólo se leeran n caracteres, para no desbordar el array. Si la línea tiene menos caracteres,se meteran en el array y se pondra un fin de cadena (un \0) al final.
• FILE* stream. Lo que obtuvimos con el fopen() del fichero que queremos leer.
Esta función devuelve la misma cadena de caracteres que le pasamos si lee algo del fichero o NULL si hay algún problema (fin de fichero, por ejemplo).
Para leer todas las líneas consecutivamente del fichero, podemos hacer un bucle hasta que esafunción fgets() nos devuelva NULL. Puede ser así
char cadena[100]; /* Un array lo suficientemente grande como para guardar la línea más larga del fichero */
...
while (fgets(cadena, 100, f) != NULL)
{
/* Aquí tratamos la línea leída */
}
Lo de distinto de NULL es una forma como otra cualquiera de mirar cuando se termina el fichero. Si queremos podemos hacer alguna variante usando feof() ocualquier otra cosa que se nos ocurra.
Un detalle que aquí no es importante, pero que es posible que tengamos que tener en cuenta en otros casos. El caracter fin de línea (\n en linux, \r\n en windows) NO se incluye en la cadena leída. fgets() lo lee del fichero, pero NO lo copia en cadena, así que no lo tenemos. En su lugar pone en en cadena un fin de cadena \0 (recuerda que en C todas lascadenas se terminan con un byte cero, que se representa como \0)
Como queremos ir escribiendo estas líneas en otro fichero, usaremos la función fputs(). Esta función escribe la cadena en el fichero y le añade un fin de línea (\n en linux, \r\n en windows).
La función fputs() admite los siguientes parámetros
• char *s: El array de caracteres que queremos escribir. Se escribirán secuencialmente todoslos caracteres hasta que se encuentre un fin de cadena \0
• FILE *stream: Lo que obtuvimos al abrir el fichero de escritura.
Esta función devuelve el número de caracteres escritos o FEOF (un entero definido en algún include) si hay algún problema.
Nuestro código completo de copia quedaría así
char cadena[100]; /* Un array lo suficientemente grande como para guardar la línea más larga delfichero */
...
while (fgets(cadena, 100, f) != NULL)
{
fputs(cadena, f2);
}
Ya sólo queda cerrar los ficheros
fclose(f);
fclose(f2);
La función fscanf()
Una de las funciones que explica cualquier libro para leer ficheros de texto es fscanf().
La idea de fscanf es que como parámetro se le pasa el formato de lo que se quiere leer, y esta se encarga de buscarlo en el fichero y leerlo....
Regístrate para leer el documento completo.