ssrntit1 Programacién en CiManejo de archivos - Wiklibros
Programacién en C
Manejo de archivos
De Wikilibros, la coleccién de libros de texto de contenido libre.
Programacién en C/Manejo de archivos
Asi como hemos revisado la salida y entrada por pantalla y teclado respectivamente, veremos ahora la entrada
ylo salida de datos utiizando ficheros, lo cual serd imprescindible para un gran nimero de aplicaciones que
deseemos desarrollar.
Contenido
= 1 Ficheros
= 1.1 fopen
= 12 felose
= 13 feof
= 14 rewind
= 2 Lectura
= 2.1 fete
2.2 fgets
2.3 fread
2.4 icant
= 3 Escritura
= 3.1 fpute
= 3.2 fputs
= 3.3 fiwtite
= 3.4 fprintt
Ficheros
Elestindar de C contiene fimciones varias para la edicién de ficheros, estas estén 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 informacién del fichero. La secuencia que usaremos para
realizar operaciones sera la siguiente:
* Crear un apuntador del tipo FILE *
* Abrir el archivo utilizando la funcién fopen y asigndndole el resultado de la llamada a nuestro apuntador.
= Hacer las diversas operaciones (lectura, escritura, etc).
* Cerrar el archivo utilizando la fimcién felose.ssrntit1 Programacién en CiManejo de archivos - Wiklibros
Esta fimcién sitve para abrir y crear ficheros en disco.
El prototipo correspondiente de fopen es:
FILE * fopen (const char *£filename, const char *opentypel
Los parimetros de entrada de fopen son:
filename: una cadena que contiene un nombre de fichero vilido. opentype: especitica el tipo de fichero que se
abrird 0 se crear’,
Una lista de parmetros opentype para la fimcién fopen son:
= 'r": abrir un archivo para lectura, el fichero debe existr.
= "w" :abrir un archivo para escritura, se crea sino existe o se sobreescribe si existe
= a" abrir un archivo para escritura al final del contenido, sino existe se crea.
= "r+" abrir un archivo para lectura y escritura, el fichero debe existir.
= "wh": crear un archivo para lectura y escritura, se crea sino existe o se sobreescribe si existe.
= "at" :abriv/erear un archivo para lectura y eseritura al final del contenido
Adicionalmente hay tipos utilizando "b" (binary) los cuales no s
Ios sistemas operativos que no pertenecen a la familia de unix.
srin mostrados por ahora y que solo se usan en
felose
Esta fimcidn sirve para poder cerrar un fichero que se ha abierto.
Elprototipo correspondiente de felose es
int felose (FILE “stream; A
Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algun error, el valor
de retomno es la constante EOF
Un ejemplo pequefio para abrir y cerrar el archivo llamado fichero.in en modo leetura:
t main(int arge, char** argv)
FILE “fp; 7
fp = fopen ( "fichero.in"™, "r™ } 7
felose ( fp
Como vemos, en el ejemplo se utiizé el opentype "s", que es para la kectura.
tra cosa importante es que el lenguaje C no tiene dentro de siuna estructura para el manejo de excepciones 0
de ertores, por eso es necesario comprobar que el archivo fue abierto con éxito "if(archivo = NULL)". Sissrntit1 Programacién en CiManejo de archivos - Wiklibros
solo vamos a dar una salida con un retomo de 1 que sirve para sefialar que el programa termino por un error.
feof
Esta fimcién sitve 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 fgete del archivo con el macro EOF
declarado dentro de stdio.h, pero este método no offece la misma seguridad (en especial al tratar con los
archivos "binarios"), La fimcién feof siempre devolveri cero (Falso) sino es encontrado EOF en el archivo, de
Jo contrario regresaré un valor distinto de cero (Verdadero).
El prototipo correspondiente de feofes:
feof (PILE *fichero);
rewind
Literalmente significa "'rebobinar”, sitia el cursor de lectura/escritura al principio del archivo,
El prototipo correspondiente de rewind es:
void rewind (FILE *fichero
s) que esta guardado en el disco
Lectura
Unarchivo generalmente debe verse como un string (una cadena de caracter
duro, Para trabajar con los archivos existen diferentes formas y diferentes fimneiones. Las fimciones que
podriamos usar para leer un archivo son:
= char fgete(FILE *archivo)
= char *fgets(char *buffer, int tamano, FILE *archivo)
= size_{ fiead(void *puntero, size_{ tamano, size_t cantidad, FILE *archivo);
= int fcanf{FILE *fichero, const char * formato, argumento,
Las primeras dos de estas fimciones son muy parecidas entre si, Pero la tercera, por el numero y el tipo de
parimetros, nos podemos dar cuenta de que es muy diferente, por eso la trataremos aparte junto al fwrite que
¢s su contraparte para escritura
fgete
Esta fimcién lee un caracter a la vez del archivo que esta siendo seflalado con el puntero *arehivo. En caso de
que la lectura sea exitosa devuelve el caracter leido y en caso de que no lo sea o de encontrar el final del
archivo devuelve EOF.
El prototipo correspondiente de fgete es:
char fyete (FILE tarchivo) :
Esta fimcién se usa generalmente para recorrer archivos de texto. A manera de ejemplo vamos a suponer que
tenemos un archivo de texto llamado "prueba.txt" en el mismo directorio en que se encuentra el fuente de
nuestro programa. Un pequefio programa que lea ese archivo sera:seit Programacién en CiManejo de archivos - Wiklioros
nt main()
FILE “archivo;
har caracter;
archive — fopen("prueba.txt",
3 (archivo == NULL)
printf("\nError de apertura del archivo. \a\n");
printé("\nb1 ‘ive de prueba es \n\n
le (feof (archivo)
caracter
printé("
fyete (archivo) ;
o",caracter);
fgets
Esta fincién esta disefiada para leer cadenas de caracteres. Leerd hasta n-1 caracteres o hasta que lea un
retomo de linea, En este titimo caso, el caricter de retomo de linea tambign es leido.
Elprototipo correspondiente de fgets es:
char *fyets (char “buffer, int tamaio, PILE ‘archivo);
Elprimer parimetro buffer lo hemos llamado asi porque es un puntero a un espacio de memoria del tipo char
(podriamos usar un arreglo de char). El segundo parimetro es tamatio que es el limite en cantidad de caracteres
a leer para la funcion fgets. Y por uiimo el puntero del archivo por supuesto que es la forma en que fgets
sabra a que archivo debe leer.
finclude *
dinclude fe]
int main(
FILE *archivo;
har caracteres [100];
archivo = fopen("prueba.txt",
(archivo == NULL)
exit (1);
printé("\nEl contenido del archivo de prueba es \n\n");
(feof (archivo) == 0)
fgets (caracteres, 100, archivo);
print£("$s" caracteres) ;ssrntit1 Programacién en CiManejo de archivos - Wiklibros
Este es 1 mismo ejemplo de antes con la diferencia de que este hace uso de fgets en lugar de fgete. La funcién
fgets se comporta de la siguiente manera, leerd del archivo apuntado por archivo los caracteres que encuentre
ya ponerlos en buffer hasta que lea un caracter menos que la cantidad de caracteres especificada en tamatio o
hasta que encuentre el final de una linea (\n) 0 hasta que encuentre el final del archivo (EOF). En este ejemplo
no vamos a profindizar mas que para decir que caracteres es un buffer, los pormenores seran explicados en la
seccién de manejo dinimico de memoria.
Elbeneficio de esta fimeidn es que se puede obtener una linea completa a la vez. Y resulta muy itil para algunos
fines como la construccién de un parser de algiin tipo de archivo de texto
fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream);
Esta fimciin lee un bloque de una "stream" de datos. Efectia la lectura de un arreglo de elementos "count", cada
uno de los cuales tiene un tamaiio definido por "size", Luego los guarda en el bloque de memoria especificado
por "ptr", El indicador de posicién de la cadena de caracteres avanza hasta leer la totalidad de bytes. Si esto es
exitoso la cantidad de bytes leidos es (size* count,
PARAMETROS:
ptr : Puntero a un bloque de memoria con un tamafio minimo de (size*count) bytes.
size : Tamafio en bytes de cada elemento (de los que voy a leer).
count : Niimero de elementos, los cuales tienen un tamatio "size"
stream: Puntero a objetos FILE, que especifica la cadena de entrada.
fscanf
La fimeién ficanf fimciona igual que s
lugar del teclado,
anf en cuanto a pardmetros, pero la entrada se toma de un fichero en
El prototipo correspondiente de fseanf es:
int fscanf (FILE *fichero, const char *formato, argumento, ...); :
Podemos ver un ejemplo de su uso, abrimos el documento "fichero.txt" en modo lectura y leyendo dentro de el
finch
int main ( int arge, chaz
“argv }
FILE *fp;
har buffer {100
fp = fopen (ssrntit1 Programacién en CiManejo de archivos - Wiklibros
Escritura
Asicomo podemos leer datos desde un fichero, también se pueden crear y escribir ficheros con la informacién
que deseamos almacenar, Para trabajar con los archivos existen diferentes formas y diferentes fimciones. Las
fimciones que podriamos usar para escribir dentro de un archivo son:
* int fjute(int caracter, FILE *archivo)
* int fputs(const char *buffer, FILE *archivo)
= size_t fivrite(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);
= int fprinti{FILE ‘archivo, const char *formato, argumento, ...);
fpute
Esta fincién escribe un cardcter a la vez del archivo que esta siendo sefialado con el puntero *archivo. El valor
de retomo es el cardeter escrito, sila operacin fue completada con éxito, en caso contrario ser EOF.
El prototipo correspondiente de fpute es:
fpute(int caracter, FILE *archivo); a
Mostramos un ejemplo del uso de fpute en un "“‘ichero.txt", se eseribira dentro del fichero hasta que
presionemos la tecla enter,
“argv }
em, MEE
exto al ficher
((caracter = getenar()) != '\n')
fpute(caracter, fp));
fputs
La fincién fputs escribe una cadena en un fichero. No se afiade el cardcter de retorno de linea ni el cardcter
lfilHi ld t a i EOF d L oatdtdsein Programacin en CiManejo de archivos - Wikies
Elprototipo correspondiente de fputs es:
int fputs(const char “buffer, FILE *archivo)
para ver su fincionamiento mostramos el siguiente ejemplo:
#include B)
main ( int arge, char **argv }
FILE “fp;
cadena[] = "Mostrando el uso de [puts en un Cichero.\n";
fp = fopen ( "fichero.txt", "Et" ); 5
fputs( cadena, fp );
felose ( fp);
o;
fwrite
Esta fimcién esti 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 direccién de
memoria determinada. El valor de retomo es el nimero de registros escritos, no el nimero de bytes. Los
paramettos son: un puntero a la zona de memoria de donde se obtendran los datos a escribir, el tamafio de
cada registro, elnimero de registros a escribir y un puntero a la estructura FILE del fichero al que se hard la
escritura,
Elprototipo correspondiente de fwrite es:
write (
id *puntero, size t tamano, size t cantidad, FILE *archive); 2
Un ejemplo conereto del uso de fwrite con su contraparte fread y usando funciones es:
laa J
* cheroCompleto.c
* Copyright 2009 Julio César Brizuela
y
clude