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);
}
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.
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?
Como ya te comento eferion hay esas dos formas de hacer
en C++ seria algo como esto y es la segunda forma de hacerlo
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 *>(®istroVacio),
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
no se nada de c++, pero gracias igual
Cambia primero los datos en memoria y cuando vayas a guardar reescribes todos y punto.