Professional Documents
Culture Documents
Manejo de archivos
As como hemos revisado la salida y entrada por pantalla y teclado respectivamente, veremos
ahora la entrada y/o salida de datos utilizando ficheros, lo cual ser imprescindible para un gran
nmero de aplicaciones que deseemos desarrollar.
Contenido
1 Ficheros
o 1.1 fopen
o 1.2 fclose
o 1.3 feof
o 1.4 rewind
2 Lectura
o 2.1 fgetc
o 2.2 fgets
o 2.3 fread
o 2.4 fscanf
3 Escritura
o 3.1 fputc
o 3.2 fputs
o 3.3 fwrite
o 3.4 fprintf
Ficheros
El estndar de C contiene varias funciones para la edicin de ficheros, estas estn definidas en la
cabecera stdio.h y por lo general empiezan con la letra f, haciendo referencia a file. Adicionalmente
se agrega un tipo FILE, el cual se usar como apuntador a la informacin del fichero. La secuencia
que usaremos para realizar operaciones ser la siguiente:
fopen
Esta funcin sirve para abrir y crear ficheros en disco.
El prototipo correspondiente de fopen es:
filename: una cadena que contiene un nombre de fichero vlido. opentype: especifica el tipo de
fichero que se abrir o se crear.
Adicionalmente hay tipos utilizando "b" (binary) los cuales no sern mostrados por ahora y que solo
se usan en los sistemas operativos que no pertenecen a la familia de unix.
fclose
Esta funcin sirve para poder cerrar un fichero que se ha abierto.
Un ejemplo pequeo para abrir y cerrar el archivo llamado fichero.in en modo lectura:
#include <stdio.h>
return 0;
}
Como vemos, en el ejemplo se utiliz el opentype "r", que es para la lectura.
Otra cosa importante es que el lenguaje C no tiene dentro de si una estructura para el manejo de
excepciones o de errores, por eso es necesario comprobar que el archivo fue abierto con xito "if
(fp == NULL)". Si fopen pudo abrir el archivo con xito devuelve la referencia al archivo (FILE *),
de lo contrario devuelve NULL y en este caso se debera revisar la direccion del archivo o los
permisos del mismo. En estos ejemplos solo vamos a dar una salida con un retorno de 1 que sirve
para sealar que el programa termino por un error.
feof
Esta funcin sirve para determinar si el cursor dentro del archivo encontr el final (end of file).
Existe otra forma de verificar el final del archivo que es comparar el caracter que trae fgetc del
archivo con el macro EOF declarado dentro destdio.h, pero este mtodo no ofrece la misma
seguridad (en especial al tratar con los archivos "binarios"). La funcin feof siempre devolver cero
(Falso) si no es encontrado EOF en el archivo, de lo contrario regresar un valor distinto de cero
(Verdadero).
rewind
Literalmente significa "rebobinar", sita el cursor de lectura/escritura al principio del archivo.
fgetc
Esta funcin lee un caracter a la vez del archivo que esta siendo sealado con el puntero *archivo.
En caso de que la lectura sea exitosa devuelve el caracter ledo y en caso de que no lo sea o de
encontrar el final del archivo devuelveEOF.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *archivo;
char caracter;
archivo = fopen("prueba.txt","r");
if (archivo == NULL){
while (feof(archivo) == 0)
{
caracter = fgetc(archivo);
printf("%c",caracter);
}
}
fclose(archivo);
return 0;
}
fgets
Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o hasta
que lea un cambio de lnea '\n' o un final de archivo EOF. En este ltimo caso, el carcter de
cambio de lnea '\n' tambin es ledo.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *archivo;
char caracteres[100];
archivo = fopen("prueba.txt","r");
if (archivo == NULL)
exit(1);
El beneficio de esta funcin es que se puede obtener una linea completa a la vez. Y resulta muy
til para algunos fines como la construccin de un parser de algn tipo de archivo de texto.
fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
Esta funcin lee un bloque de una "stream" de datos. Efecta la lectura de un arreglo de elementos
"count", cada uno de los cuales tiene un tamao definido por "size". Luego los guarda en el bloque
de memoria especificado por "ptr". El indicador de posicin de la cadena de caracteres avanza
hasta leer la totalidad de bytes. Si esto es exitoso la cantidad de bytes ledos es (size*count).
PARAMETROS:
size : Tamao en bytes de cada elemento (de los que voy a leer).
fscanf
La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se toma de un
fichero en lugar del teclado.
char buffer[100];
fp = fopen ( "fichero.txt", "r" );
fclose ( fp );
return 0;
}
Escritura
As como podemos leer datos desde un fichero, tambin se pueden crear y escribir ficheros con la
informacin que deseamos almacenar, Para trabajar con los archivos existen diferentes formas y
diferentes funciones. Las funciones que podramos usar para escribir dentro de un archivo son:
fputc
Esta funcin escribe un carcter a la vez del archivo que esta siendo sealado con el
puntero *archivo. El valor de retorno es el carcter escrito, si la operacin fue completada con
xito, en caso contrario ser EOF.
#include <stdio.h>
char caracter;
fclose ( fp );
return 0;
}
fputs
La funcin fputs escribe una cadena en un fichero. No se aade el carcter de retorno de lnea ni
el carcter nulo final. El valor de retorno es un nmero no negativo o EOF en caso de error. Los
parmetros de entrada son la cadena a escribir y un puntero a la estructura FILE del fichero donde
se realizar la escritura.
fputs( cadena, fp );
fclose ( fp );
return 0;
}
fwrite
Esta funcin est pensada para trabajar con registros de longitud constante y forma pareja
con fread. Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud
almacenados a partir de una direccin de memoria determinada. El valor de retorno es el nmero
de registros escritos, no el nmero de bytes. Los parmetros son: un puntero a la zona de memoria
de donde se obtendrn los datos a escribir, el tamao de cada registro, el nmero de registros a
escribir y un puntero a la estructura FILE del fichero al que se har la escritura.
El prototipo correspondiente de fwrite es:
fprintf
La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se dirige a un
archivo en lugar de a la pantalla.
fprintf(fp, buffer);
fprintf(fp, "%s", "\nEsto es otro texto dentro del fichero.");
fclose ( fp );
return 0;
}