[C con Clase] ayuda con archivos o ficheros

Steven Davidson srd4121 en njit.edu
Jue Ene 26 11:41:36 CET 2012


Hola Javier,

2012/1/25 javier camacho <javier_camachove en hotmail.com>:
> Muy buenos los temas,, yo realmente quiero ver la posibilidad de que me envíen un ejercicio con una estructura de archivo pequeña pero debe tener  un menú con las siguientes opciones: crear archivo, cargar datos en el archivo, consultar datos, modificar datos, eliminar datos y un reporte por pantalla,,, es una asignación que me enviaron y debo explicarla en una clase magistral a mis compañeros,,,, de antemano gracia
>
> Yo lo realice con array, pero no me sirvió por que era temporal al apagar el equipo perdía la información, debe ser con archivos
>

Bien. Pues la solución a tu problema es guardar todos los elementos
actuales del array en un fichero. Si el fichero te sirve solamente
para tu programa, entonces sugiero crear un archivo binario y escribir
todos los bytes del array tal y como están estructurados en memoria
sin aplicar ningún formato añadido a los datos a almacenar.

Si estás usando las bibliotecas de C++, te aconsejo que uses
'ofstream' y luego usa la función miembro, 'write()', la cual requiere
un array de bytes de tipo 'const char', por lo que seguramente
necesitarás realizar un cásting explícito. Por ejemplo,

struct Algo {...};
...
Algo aDatos[100];
...
ofstream ofsDatos( "datos.dat", ios::out | ios::binary );

ofsDatos.write( reinterpret_cast< const char * >( aDatos ), sizeof aDatos );

Ahora bien, para que el formato del fichero sea más flexible,
seguramente convendría crear un formato que guarde la cantidad de
registros en el fichero que implica la cantidad de elementos actuales
en el array. El esquema de tal formato sería el siguiente:

[CANTIDAD--4 bytes] [REGISTRO_1--sizeof(Algo) bytes]
[REGISTRO_2--sizeof(Algo) bytes] ... [REGISTRO_N--sizeof(Algo) bytes]

Entonces, habría que escribir esta cantidad antes de escribir todos
los demás registros guardados en el array del programa. Por ejemplo,

int nCantActual;
...
ofsDatos.write( reinterpret_cast< const char * >( &nCantActual ),
sizeof nCantActual );
ofsDatos.write( reinterpret_cast< const char * >( aDatos ),
sizeof(aDatos[0]) * sizeof nCantActual );

Como puedes ver, hay que hacer un cálculo para averiguar la cantidad
de bytes (char) que queremos en 'aDatos'.


Espero que esto te aclare la duda.

Steven




Más información sobre la lista de distribución Cconclase