Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Eliminar archivos

Estas en el tema de Eliminar archivos en el foro de C/C++ en Foros del Web. Por si fuera poco, la conspiracion de los archivos contra mi sigue! Ahora tengo el caso de eliminar un registro de un archivo. Para esto, ...
  #1 (permalink)  
Antiguo 05/03/2008, 14:04
Avatar de arwen_1  
Fecha de Ingreso: diciembre-2006
Mensajes: 81
Antigüedad: 17 años, 4 meses
Puntos: 0
Pregunta Eliminar archivos

Por si fuera poco, la conspiracion de los archivos contra mi sigue!

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 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

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
  #2 (permalink)  
Antiguo 06/03/2008, 14:11
Avatar de arwen_1  
Fecha de Ingreso: diciembre-2006
Mensajes: 81
Antigüedad: 17 años, 4 meses
Puntos: 0
Re: Eliminar archivos

Me han recomendado en Foros Club Delphi una posible solucion no muy eficiente, pero que es la que se tiene hasta ahora.

Y es que luego de llenar el archivo auxilliar, abrir el archivo Base reescribiendo todo su contenido, con el del auxiliar.

Aun espero por la respuesta de si existe y como se utiliza, la funcion remove y rename, ya que sería la solucion ideal.!

Gracias de antemano.
  #3 (permalink)  
Antiguo 09/03/2008, 10:17
 
Fecha de Ingreso: marzo-2008
Mensajes: 5
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Eliminar archivos

Mira yo te recomiendo olvidarte del tipo FILE. Por que no usas el tipo fstream de la libreria fstream.h????
Esta es una funcion que use yo para eliminar un registro, sin usar un auxiliar (historia es un struct por las dudas):

Código:
void consulta::borra(historia &h){
        pacientes.open("archivo.dat",ios::in|ios::out|ios::binary);
        pacientes.seekg(0,ios::end);
        int i,cant= pacientes.tellg()/sizeof(historia);
        pacientes.seekp(0,ios::beg);
        for(i=0;i<cant;i++){
                historia aux;
                pacientes.read((char*)&aux,sizeof(historia));
                if(aux==h) break; //el operador == esta sobrecargado en el struct                                   
                                            //historia
        }
        for(int j=i+1;j<cant;j++){
                pacientes.seekp(j*sizeof(historia),ios::beg);
                historia aux;
                pacientes.read((char*)&aux,sizeof(historia));
                pacientes.seekp((j-1)*sizeof(historia),ios::beg);
                pacientes.write((char*)&aux,sizeof(historia));
        }
        historia *his=new historia[cant];
        pacientes.seekp(0,ios::beg);
        pacientes.read((char*)his,(cant-1)*sizeof(historia));
        pacientes.close();
        pacientes.open("archivo.dat",ios::in|ios::out|ios::binary|ios::trunc);
        pacientes.write((char*)his,(cant-1)*sizeof(historia));
        delete[] his;
}
  #4 (permalink)  
Antiguo 09/03/2008, 17:26
 
Fecha de Ingreso: mayo-2006
Ubicación: Venezuela
Mensajes: 33
Antigüedad: 18 años
Puntos: 0
Re: Eliminar archivos

es necesario eliminarlo fisicamente?, es mas sencillo crear un campo en la estructura del archivo tipo bandera, 1=> si existe...0=> si fue borrado, y ya
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:40.