como borro o modifico datos en un fichero?

Iniciado por pedroedlp, 21 Abril 2014, 23:52 PM

0 Miembros y 1 Visitante están viendo este tema.

pedroedlp

Hola estoy haciendo un programa que lo que hace es guardar datos de productos en un fichero, pero no se como hacer para borrar o modificar estos datos, osea no se como hacer la funcion que realice esto, les dejo el codigo...



#include <stdio.h>

typedef struct producto{
    char nombre[20];
    char fabricante[20];
    char descripcion[50];
    int precio;
} producto ;


void imprimirMenu(void);
void nuevoProducto(char *nombreArchivo);
void borrarProducto();
void modificarProducto();
void verProducto();


int main(){

    char *nombreArchivo="productos.dat";
    int opcion;

    imprimirMenu();
    fflush(stdin);
    scanf("%d", &opcion);

    switch (opcion){

        case 1: nuevoProducto(nombreArchivo);
        case 2: borrarProducto();
        case 3: modificarProducto();
        case 4: verProducto();
       
        default: printf("\n\nOpcion incorrecta");
       
    }


    printf("\n\n");

    return 0;
}


void imprimirMenu(void){
    printf("\n----Almacen----");
    printf("\n\n-Menu: ");
    printf("\n1-Nuevo producto\n2-Borrar producto\n3-Modificar producto\n4-Ver producto\n\nOpcion: ");
}

void nuevoProducto(char *nombreArchivo){

    system("cls");

    FILE *pf;

    if((pf=fopen(nombreArchivo, "a"))==NULL){
        printf("\nNo se pudo abrir el archivo");
        exit (-1);
    }

    producto p;

    printf("\nNombre: ");
    fflush(stdin);
    gets(p.nombre);
    printf("\nFabricante: ");
    fflush(stdin);
    gets(p.fabricante);
    printf("\nDescripcion: ");
    fflush(stdin);
    gets(p.descripcion);
    printf("\nPrecio: ");
    fflush(stdin);
    scanf("%d", &p.precio);

    fputs("Nombre: ", pf);
    fputs(p.nombre, pf);
    fputs("\nFabricante: ", pf);
    fputs(p.fabricante, pf);
    fputs("\nDescripcion: ", pf);
    fputs(p.descripcion, pf);
    fputs("\nPrecio: ", pf);
    fprintf(pf, "%d\n\n", p.precio);

}


eferion

Si quieres borrar un registro tienes dos opciones:

* Reescribes completamente el fichero evitando guardar el registro borrado.

* con fseek te colocas al inicio del registro y sobreescribes su contenido de tal forma que al leerlo puedas identificarlo como un registro borrado y puedas ignorarlo ( por ejemplo dejando el nombre vacío ).

Si quieres modificar un registro tienes también dos opciones:

* Reescribes completamente el fichero con los nuevos datos.

* con fseek te colocas al inicio del registro y sobreescribes su contenido con la información actual.

Como ves la opción elegida te sirve para ambos cometidos. La primera es más sencilla de implementar pero también más lenta... la segunda es más rápida y eficiente... pero requiere algo más de código por tu parte.

pedroedlp

Cita de: eferion en 22 Abril 2014, 09:11 AM
Si quieres borrar un registro tienes dos opciones:

* Reescribes completamente el fichero evitando guardar el registro borrado.

* con fseek te colocas al inicio del registro y sobreescribes su contenido de tal forma que al leerlo puedas identificarlo como un registro borrado y puedas ignorarlo ( por ejemplo dejando el nombre vacío ).

Si quieres modificar un registro tienes también dos opciones:

* Reescribes completamente el fichero con los nuevos datos.

* con fseek te colocas al inicio del registro y sobreescribes su contenido con la información actual.

Como ves la opción elegida te sirve para ambos cometidos. La primera es más sencilla de implementar pero también más lenta... la segunda es más rápida y eficiente... pero requiere algo más de código por tu parte.

pero si me pongo con fseek en donde comienza el archivo como cambio por ejemplo el producto que esta en el medio?

nolasco281

#3
Como ya te comento eferion hay esas dos formas de hacer

en C++ seria algo como esto y es la segunda forma de hacerlo

Código (cpp) [Seleccionar]
int eliminar()
{
   // 1. Abrir archivo.
   fstream archivo("Clientes.bin",
           ios::out | ios::in | ios::binary);
   
// Validar apertura de archivo.
   if(!archivo) // Condicion de error.
        return 0; // Cero significa error.
   
   // Leer datos.
   Cliente registroVacio;
   int idbuscar;

   interfaceDatos();    //Funcion para el menu de opciones
       
   // Solicitud clave de búsqueda.
   cout << setxy(38, 4);
   clreol(); // Borrar linea.
   cin >> idbuscar;                  //Busca el registro a borrar
   cin.ignore();
   
   while(idbuscar > 0) // Centinela
   {
        // Posicionamiento de lectura.  //seekp      
        archivo.seekp(
        (idbuscar - 1) * sizeof(Cliente));

        // escritura de datos.
        archivo.write(
        reinterpret_cast<const char *>(&registroVacio),
        sizeof(Cliente));                  
       
        // Solicitud clave de búsqueda.
        cout << setxy(38, 4);
        clreol(); // Borrar linea.
        cin >> idbuscar;
        cin.ignore();
   } // Fin while
       
   // 3. Cerrar archivo.
   archivo.close();
   return 1;
}


espero averte ayudado saludos.

PD:: el de modificar es casi lo mismo
Lo que se puede imaginar... se puede programar.

pedroedlp


amchacon

Cambia primero los datos en memoria y cuando vayas a guardar reescribes todos y punto.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar