Está en la página 1de 8

ARCHIVOS BINARIOS

Pueden leer y escribir simultneamente Archivos de acceso aleatorio Permiten acceso secuencial y aleatorio. Es posible insertar elementos y cambiar sus valores sin tener que escribir nuevamente el archivo. Primer implementacin: Todos los registros del archivo son del mismo tipo y tamao. Librer a: ! include "#stream.h$ Apertura de archivos de entrada y salida
Declaracin de apertura fstream descriptor // descriptor nombre del archivo

%lase #stream:
Permite declarar objetos que manejan archivos cuyo acceso sea de entrada y de salida ( file stream). Esta clase normalmente se utiliza para el manejo de archivos binarios lujos de entrada y salida de archivos Esta clase dispone de los si!uientes m"todos o funciones mas utilizados # fstream descriptor /// descriptor$archivo%

descriptor unido con funciones. descriptor.funcin()


Ejemplo # stream archivo &rchivo.open() &rchive.read() ABRIR ARCHIVO 'PE(()nombre del archivo*+ modo de acceso) modo de acceso ios::in ios::out &brir archivo para lectura &brir archivo para escritura

ios::ate

Posicin inicial# fin del archivo ,ada salida se a!re!a al final ios::app del archivo -i el archivo ya e.iste se borra ios::trunc su contenido ios::binary /odo binario ,ombinacion de los anteriores con el separador ios##in0in##out 0 ios##app 0 ios##binary Para abrir un archivo Ejemplo# stream archivo descriptor.open (1datos.bin2+ ios##out 0 ios##app 0 ios##binary)% CERRAR ARCHIVO ,lose() Ejemplo descriptor.close() Lectura de registro 3ee cierta cantidad de byes del archivo hacia la direccion de memoria de una variable que sea capaz de recibir la informacin de acuerdo a su escritura de datos 4ead((char 5)6tres!istro+ tamano en bytes) Escritura de registro 7raba cierta cantidad de bytes en el archivo desde la direccion de memoria de una variable que contiene la direccin de acuerdo a una estructura de datos 8rite((char 5)6tre!istro+ tamano en bytes) Funciones de Arc i!os ,errar un archivo# -e encar!a de vaciar los buffers que usa el archivo y cerrar el archivo. Descriptor.close()% uncin eof()# ara conocer si se ha lle!ado al final del archivo al leerlo.

Opciones de estado Permiten conocer el estado de los flujos de datos bad"# :4etorna true si ocurre una falla en las operaciones de lectura o escritura. Por ejemplo en caso de que tratemos de escribir en un archivo que no est9 abierto para escritura.

fai$"# 4etorna true en los mismos casos que bad"# y adem9s en caso de que ocurra un error de formato+ como tratar de leer un n:mero entero y obtener una letra. eof"# 4etorna true si el archivo abierto ha lle!ado a su fin. good"# Es el m9s !en"rico# 4etorna fa$se en los mismos casos en los que al llamar a las funciones previas hubi"ramos obtenido true. %unteros de f$u&o get y put unciones para obtener posicin tell!() tellp()

Funciones para posicionarse -ee;!() # traslada al puntero de re!istro hacia una posicin determinada antes de una operacin de lectura -ee;p() # traslada al puntero de re!istro hacia una posicin determinada antes de una operacin de !rabacion see'g " desplazamiento en bytes( referencia #) see'p " desplazamiento en bytes( referencia #) desp$a*amiento: es en bytes normalmente es una formula posici+n , si*eof"registro# referencia puede ser : ios::beg ios::cur ios::end Desplazamiento especificado desde el principio del flujo Desplazamiento especificado desde la posicin actual del puntero Desplazamiento especificado desde el final del flujo

tellg()) devuelve la posicin relativa actual del cursor asociado al fichero de entrada !et tellp() devuelve la posicin relativa actual del cursor asociado al fichero de salida put y devuelve un <= en caso de e.istir al!:n error. FICHERO- BI.ARIO-. 3ectura byte a byte. descriptor.get(ch); Escritura byte a byte. descriptor.put(ch);

FICHERO- BI.ARIO-.
Escritura por b$o/ue de bytes. descriptor.read(&c, num); Escritura por b$o/ue de bytes. Descriptor.write(&c, num); Recomendaci+n: 0sar si*eof"# y pasar c por referencia unciones -trcpy(cadena=+ cadena>) # -e encuentra la en la librer?a )strin!.h* &si!na el contenido de la cadena> hacia la cadena=)

El si!uiente pro!rama almacena en un fichero los =@ primeros enteros+ lue!o muestra por pantalla el quinto entero (o sea el A)+ posteriormente lo reemplaza por el valor =@@+ y al final visualiza en el monitor el contenido del fichero. #include <fstream.h> #include <iostream.h> int main(){ int i,N; fstream fichbin("e emplo!!.dat",ios""binary # ios""in # ios""out); for (i$!;i<$!%;i&&) fichbin.'rite((i,sizeof(int)); )) *lmacena los !% primeros enteros fichbin.see+p(,-sizeof(int)); )) se posiciona al principio del .uinto) entero fichbin.read((N,sizeof(float)); )) /ee dicho entero cout <<endl << "0uinto$ " << N << endl; )) 1isualiza el 1alor 2 fichbin.see+p(,-sizeof(int)); )) se posiciona de nue1o en el .uinto entero )) pues el cursor hab3a a1anzado. i$!%%; fichbin.'rite((i,sizeof(int)); )) 4odifica el 1alor 2 por el 1alor !%%; fichbin.see+p(%-sizeof(int)); )) se posiciona de nue1o al principio del fichero for (i$!;i<$!%;i&&){ fichbin.read((N,sizeof(float)); cout <<endl << i << "$ " << N << endl; )) 5e 1isualiza el contenido 6 fichbin.close(); 6 )) 7in del main

=. &rchivos binarios# E1- de estructuras en un archivo. Dada la si!uiente estructura para contener los datos t?picos de un empleado+ escribe dos funciones+ una para introducir los datos de un empleado por teclado y calcular su salario+ y otra para visualizarlos por pantalla. Probar el funcionamiento del si!uient pro!rama#
2. ... 3. struct empleado { 4. char DNI[9]; 5. unsigned int num_horas; . unsigned int horas_e!tras; ". #loat salario; $. %; 9. ... &'. main() &&. { &2. empleado pepe* !; &3. #stream #; &4. &5. entrada_datos(pepe); & . +isuali,ar(pepe); &". &$. #.open(-empleados.dat-* ios..out / ios..0inar1); &9. #.2rite((char 3)4pepe* si,eo#(empleado)); 2'. #.close(); 2&. 22. #.open(-empleados.dat-* ios..in / ios..0inar1); 23. #.read((char 3)4!* si,eo#(empleado)); 24. +isuali,ar(!); 25. #.close(); 2 . 2". return ';

Ejemplo# C incluye )iostream.h* C incluye ) fstream.h* // estructura del re!istro struct alumno D char codi!oEFG ,har nombreE>HG ,har se.o Int ep+ ef# loat pp+ promedio B% // variables !lobales stream f % &lumno t% 3on! tamre!$ sizeof(t) // objeto archive o flujo de datos // re!istro individual // tamano del re!istro

// prototipo de funciones funciones propias Joid in!resaDatos() Joid inicializar() Joid ejecutar() Joid finalizar() // funcion principal Joid main() D inicilizar() Ejecutar() inalizar() B // Desarrollo de prototipos de funciones // in!resar datos Joid in!resaDatos() Dchar rpta Do D // presenta pantalla para in!reso de datos ,lrscr() 7oto.y(A+>) cout))2alumno C 1))(umalumK=# 7oto.y(A+A)% cout))2codi!o#2% 7oto.y(A+H)% cout))2nombre#2% 7oto.y(A+L)% cout))2se.o#2% 7oto.y(A+F)% cout))2EP#2% 7oto.y(A+M)% cout))2E #2% 7oto.y(A+=@)% cout))2PP#2% // in!resa datos de un alumno

-trcpy(t.codi!o+