Professional Documents
Culture Documents
EOF
En programacin, EOF es un concepto para determinar el final de un archivo. Muchos
lenguajes de programacin tienen formas de detectar el final de archivo como condicionante
para la lectura de un flujo de datos
El carcter EOF existe en la tabla ASCII aunque no es este el carcter que indica el fin-de-
archivo en la fuente de datos, ya que un fichero no contiene como ltimo byte el carcter EOF.
En la biblioteca estndar de C, el acceso a un fichero y otras funciones I/O pueden devolver
un valor igual al simblico EOF para indicar que la condicin end-of-file se ha cumplido. Ej:
/* Ejemplo en C */
/* Se abre el archivo o stream y demas tareas... */
....
/* Se procede a la lectura */
while (!feof(&fd))
{
/* Leyendo hasta que se termine */
op_result = fread ((void*)buffer, sizeof(int), 1, &fd);
/* Chequeamos el resultado de la operacion
if (op_result == EOF)
break;
/* Se trabaja con el buffer */
.....
}
La interpretacin de C como resultado de la operacin de lectura en caso de ser EOF es, por
lo general, -1.
El puntero FILE *
Ahora es preciso abrir el fichero. Para ello usamos la funcin fopen. Esta
funcin tiene el siguiente formato:
FILE *fopen(const char *nombre_fichero, const char *modo);
En el ejemplo usbamos:
fichero = fopen("origen.txt","r");
if (fichero == NULL) {
printf( "No se puede abrir el fichero.\n" );
exit( 1 );
}
while ( feof(fichero) == 0 )
while ( !feof(fichero) )
Una vez realizadas todas las operaciones deseadas sobre el fichero hay
que cerrarlo. Es importante no olvidar este paso pues el fichero podra
corromperse. Al cerrarlo se vacan los buffers y se guarda el fichero en
disco. Un fichero se cierra mediante la funcin fclose. Esta funcin tiene el
siguiente formato:
FILE *fclose(FILE * stream);
if (fclose(fichero)!= 0)
printf( "Problemas al cerrar el fichero\n" );
Esta funcin es muy til para leer lneas completas desde un fichero. Su
formato es:
char *fgets(char *buffer, int longitud_max, FILE *fichero);
Esta funcin lee desde el fichero hasta que encuentra un carcter '\n' o
hasta que lee longitud_max-1 caracteres y aade '\0' al final de la cadena (y
retiene el carcter '\n'). La cadena leda la almacena en buffer. Si se
encuentra EOF antes de leer ningn carcter, o si se produce un error, la
funcin devuelve NULL; en caso contrario devuelve la direccin de buffer.
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fichero;
char texto[100];
fichero = fopen("origen.txt","r");
if (fichero == NULL) {
printf( "No se puede abrir el fichero.\n" );
exit( 1 );
}
if (fclose(fichero)!=0)
printf( "Problemas al cerrar el fichero\n" );
}
La funcin fread
#include <stdio.h>
main()
{
FILE *origen, *destino;
char letra;
origen = fopen("origen.txt","r");
destino= fopen("destino.txt","w");
if (origen == NULL || destino == NULL) {
printf( "Problemas con la apertura de 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" );
}
El puntero FILE
Apertura del fichero para escritura: fopen
Escritura de caracteres en el fichero: putc
Comprobacin de fin de fichero
Cierre del fichero: fclose
El puntero FILE *
putc(letra, destino);
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fichero;
char texto[100];
fichero = fopen("destino.txt","w");
if (fichero == NULL) {
printf( "No se puede crear el fichero.\n" );
exit( 1 );
}
/* Escribe en el fichero */
fputs("Esta es la primera lnea del fichero\n", fichero);
fputs("Esta es la segunda lnea\n", fichero);
fputs("Esta es la ltima lnea del fichero\n", fichero);
if (fclose(fichero)!=0)
printf( "Problemas al cerrar el fichero\n" );
fichero = fopen("destino.txt","r");
if (fichero == NULL) {
printf( "No se puede crear el fichero.\n" );
exit( 1 );
}
printf( "Contenido del fichero:\n" );
fgets(texto,100,fichero);
while (feof(fichero) == 0) {
printf( "%s",texto );
fgets(texto,100,fichero);
}
if (fclose(fichero)!=0)
printf( "Problemas al cerrar el fichero\n" );
}
fwrite
Las funciones que hemos visto anteriormente (getc, putc, fgets, fputs) son
adecuadas para trabajar con caracteres (1 byte) y cadenas. Pero, qu
sucede cuando queremos trabajar con otros tipos de datos?.
Supongamos que queremos almacenar variables de tipo int en un fichero.
Como las funciones vistas anteriormente slo pueden operar con
cadenas, deberamos convertir los valores a cadenas (funcin itoa,integer
to string). Para recuperar luego estos valores deberamos leerlos como
cadenas y pasarlos a enteros (atoi, string to integer). Pero existe una
solucin mucho ms fcil: las funciones fwrite y fread. stas nos permiten
tratar con datos de cualquier tipo, incluso con estructuras.
fwrite
donde:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct {
char nombre[20];
char apellido[20];
char telefono[15];
} registro;
main()
{
FILE *fichero;
do {
printf( "Nombre: " ); gets(registro.nombre);
if (strcmp(registro.nombre,"")) {
printf( "Apellido: " ); gets(registro.apellido);
printf( "Telfono: " ); gets(registro.telefono);
fclose( fichero );
}
fread
Siguiendo con el ejemplo anterior, vamos a leer los datos que habamos
introducido en nombres.txt .
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct {
char nombre[20];
char apellido[20];
char telefono[15];
} registro;
main()
{
FILE *fichero;
while (!feof(fichero)) {
if (fread( ®istro, sizeof(registro), 1, fichero )) {
printf( "Nombre: %s\n", registro.nombre );
printf( "Apellido: %s\n", registro.apellido);
printf( "Telfono: %s\n", registro.telefono);
}
}
fclose( fichero );
}
fseek
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fichero;
long posicion;
int resultado;
ftell
Su formato es el siguiente:
long ftell(FILE *p_fichero);
El valor que devuelve puede ser usado por fseek para volver a la posicin
actual.
fprintf y fscanf
Estas dos funciones trabajan igual que sus equivalentes printf y scanf. La
nica diferencia es que podemos especificar el fichero sobre el que
operan (si se desea, puede ser la pantalla para fprintf o el teclado
para fscanf).