Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Eliminar registro en archivo binario (https://www.clubdelphi.com/foros/showthread.php?t=53985)

tamarinda 05-03-2008 21:51:48

Eliminar registro en archivo binario
 
Por si fuera poco, la conspiracion de los archivos contra mi sigue! :neurotico

Ahora tengo el caso de eliminar un registro de un archivo.
Para esto, hago uso de un archivo auxiliar donde ire copiando todos aquellos registros del base que NO sean el que deseo eliminar.
Se supone, que luego de hacer la copia anterior debo, eliminar el archivo original o renombrarlo. es decir, colocarle al auxiliar el nombre del base.

He probado con las funciones, rename & remove, pero no me han funcionado :borracho: por ser novata en este compilador, no se si estas funciones no puedan ser utilizadas en C++ al igual que en C.

Buscando en San Google, he encontrado tambien las funciones: RenameFile & MoveFile, pero tampoco me han funcionado.

Por lo que quisiera saber, si existen (supongo que si) y cuales son las funciones que permiten renombrar y/o eliminar un archivo.

De igual manera les coloco el codigo:stress:

Código:

//ELIMINAR: elimina una estacion
void estaciones::eliminar(struct_estacion esta_actual)
{
        //abro archivo binario "ORIGINAL"
        FILE *ap_b=NULL;
        ap_b=fopen("estacion_b.dat","rb");
        //abro archivo binario "AUXILIAR"
        FILE *aux=NULL;
        aux=fopen("auxi.dat","wb");
        if (ap_b!=NULL)
        {
                struct_estacion tmp;
                int xx, num_reg, cont;

                fseek(ap_b,0,SEEK_END);
                xx=ftell(ap_b);
                num_reg=xx/(sizeof(struct_estacion));
                //leer del archivo y comparar
                for (cont=0;cont<=num_reg;cont++)
                {
                        fseek(ap_b,cont*sizeof(struct_estacion),SEEK_SET);
                        fread(&tmp,sizeof(struct_estacion),1,ap_b);
                        int comparacion_cad;
                        comparacion_cad=strcmp(tmp.nombre,esta_actual.nombre);
                        //si NO tiene el mismo nombre al introducido a eliminar
                        //entonces copialo al archivo auxiliar
                        if (comparacion_cad!=0)
                        {
                                fwrite(&tmp,sizeof(struct_estacion),1,aux);
                        }
                }
                fclose(ap_b);
                fclose(aux);
                //elimino el ahora viejo archivo de estaciones
//                DeleteFile("estacion_b.dat");
//                remove("estacion_b.dat");

                //renombrar el archivo auxiliar
//                RenameFile("auxi.dat","estacion_b.dat");
//                rename("auxi.dat","estacion_b.dat");

        }
};


Esperando su respuesta! :-) Gracias de antemano :-)

Antonioveneroso 06-03-2008 19:36:46

Tal vez sea un poco más lento e ineficiente, pero lo que podrías hacer es copiar el archivo original (estacion_b.dat), hacer las modificaciones en el auxiliar y copiar nuevamente el resultado en estacion_b.dat.
Se que no parece una buena respuesta, pero puede servir mientras encuentras cómo eliminar archivos desde tu aplicación.
Saludos!

tamarinda 06-03-2008 20:59:25

Mmm bueno... tienes razon con lo de ineficiente... pero es una posible solución! sobretodo tomando en consideracion el poco tiempo que tengo!

Gracias! de Verdad!!


La franja horaria es GMT +2. Ahora son las 11:27:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi