Sos un Genio Diego, gracias totales. Sin vos no se como hubiese hecho para aprender a manejar C. Tengo que volver a ver unos videos de cosas que saltee porque no me las pedian en el examen. Voy a ponerte like en todos los videos. Mil gracias. Hoy rindo, espero recordar todo. slds
¡Maestrooooo!! uff, no encontraba la manera de modificar el registro !! muchas gracias profesooooor !! la verdad me encantan sus videos, ojalá siga subiendo videos de este maravilloso lenguaje
Quisiera encontrar la forma de validar el UserName de mi carga , si en la carga de datos siguiente se repite el nombre que no me deje seguir cargando hasta que lo modifique? Tenes algo sobre ese tema?? Estoy haciendo un sistema de clientes y pedidos.
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no. Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.) El algoritmo modificado es: #include #include #include typedef struct { int codigo; char descripcion[41]; float precio; int borrado; // 0=existe 1=borrado } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); producto.borrado=0; fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); } fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void borrar() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a borrar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { producto.borrado=1; int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se borro dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Borrar. "); printf("7 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; case 6:borrar(); break; } } while (opcion!=7); return 0; }
@@gabrielreyes8725 Se pueden eliminar los registros de un archivo de dos maneras: borrado lógico o borrado físico. No sé si hallaste la forma de hacerlo finalmente pero yo tengo una manera de hacer el borrado físico y es mediante una función que va a pedir que ingreses el código del producto que se desea eliminar. Lo que se pretende hacer es comparar el código del producto ingresado con el código de cada registro y para aquellos códigos que sean diferentes al código ingresado los iremos guardando en un archivo nuevo. Finalmente cerramos los archivos y eliminamos con la función remove() el archivo original y renombramos el nuevo archivo con la función rename(). Te dejo el ejemplo de la función: void deleteproduct(){ FILE *archivo; FILE *temporal; archivo=fopen("Catálogo de productos.dat", "rb"); temporal=fopen("temporal.dat", "wb"); if(archivo==NULL || temporal==NULL) printf("ERROR: uno de los dos archivos no ha sido encontrado.
"); printf("Ingrese el código del producto que desea eliminar: "); int codigo; scanf("%d", &codigo); char a; printf("¿Desea continuar con la eliminación del producto? [S/N] "); fflush(stdin); scanf("%c", &a); if(a=='S' || a=='s'){ product producto; fread(&producto, sizeof(product), 1, archivo); while(!feof(archivo)){ if(producto.code!=codigo) fwrite(&producto, sizeof(product), 1, temporal); fread(&producto, sizeof(product), 1, archivo); } printf("El producto ha sido eliminado satisfactoriamente.
"); fclose(archivo); fclose(temporal); remove("Catálogo de productos.dat"); rename("temporal.dat", "Catálogo de productos.dat"); printf("¿Desea eliminar otro producto? [S/N] "); fflush(stdin); scanf("%c", &a); if(a=='S' || a=='s'){ deleteproduct(); } else printf("Proceso terminado.
@@dougnaho Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no. Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.) El algoritmo modificado es: #include #include #include typedef struct { int codigo; char descripcion[41]; float precio; int borrado; // 0=existe 1=borrado } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); producto.borrado=0; fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); } fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void borrar() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a borrar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { producto.borrado=1; int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se borro dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Borrar. "); printf("7 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; case 6:borrar(); break; } } while (opcion!=7); return 0; }
@diego, Mil, mil, mil pero en serio mil gracias. agradezco mucho la manera en poder compartir tu conocimiento de una manera muy clara y detallada, y mas aún el hecho de ayudar de una forma fraternal. Tienes un amigo en Guatemala, saludos y bendiciones.
hola! quería saber como se aria en caso que quisiera modificar un dato pero el valor nuevo lo tengo ya en una variable, es decir sin preguntar al usuario con el scanf
¿Tiene algún video que hable de cómo almacenar una cadena de caracteres, que son leidos de un archivo y que deben ser guardados en un arreglo de estructuras?
Hola buen curso, como seria el algoritmo con un archivo secuencial indexado, ya que he estado viendo que utilizan dos archivos uno para los datos del archivo y otro para el area de indices con una clave y la direccion, si pudiera darme alguna informacion o algun ejemplo de como seria el algoritmo en lenguaje c, ya que tengo que hacer un proyecto con este tipo de archivos se lo agradeceria...
Es un tema bastante más complejo que el video sobre archivos binarios. Pero te puede servir un bosquejo de como implementar dicho algoritmo con este ejemplo: #include #include // Definición de estructuras typedef struct { int id; char nombre[50]; float precio; int cantidad; } Producto; typedef struct { int id; long posicion; } Indice; void crearArchivos() { FILE* archivoProductos; FILE* archivoIndice; archivoProductos = fopen("productos.dat", "wb"); archivoIndice = fopen("indice.dat", "wb"); if (archivoProductos == NULL || archivoIndice == NULL) { printf("Error al abrir el archivo"); return; } fclose(archivoProductos); fclose(archivoIndice); } // Función para insertar una fila en el archivo de productos y en el archivo de índice void insertarFila() { FILE* archivoProductos; FILE* archivoIndice; Producto producto; Indice indice; long posicion; archivoProductos = fopen("productos.dat", "ab"); archivoIndice = fopen("indice.dat", "ab"); if (archivoProductos == NULL || archivoIndice == NULL) { printf("Error al abrir el archivo"); return; } // Pedir al usuario que ingrese los datos del nuevo producto printf("Ingrese los datos del nuevo producto: "); printf("ID: "); scanf("%d", &producto.id); printf("Nombre: "); scanf("%s", producto.nombre); printf("Precio: "); scanf("%f", &producto.precio); printf("Cantidad: "); scanf("%d", &producto.cantidad); // Escribir el nuevo producto en el archivo de productos fwrite(&producto, sizeof(Producto), 1, archivoProductos); // Obtener la posición en el archivo de productos del nuevo producto posicion = ftell(archivoProductos) - sizeof(Producto); // Escribir el nuevo índice en el archivo de índices indice.id = producto.id; // Escribir el nuevo índice en el archivo de índices indice.posicion = posicion; fwrite(&indice, sizeof(Indice), 1, archivoIndice); fclose(archivoProductos); fclose(archivoIndice); } void buscarProducto() { FILE* archivoProductos; FILE* archivoIndice; Indice indice; Producto producto; int codigo; archivoIndice = fopen("indice.dat", "rb"); if (archivoIndice == NULL) { printf("Error al abrir el archivo de indice "); return; } // Pedir al usuario que ingrese el codigo del producto a buscar printf("Ingrese el codigo del producto a buscar: "); scanf("%d", &codigo); // Buscar el indice correspondiente al codigo de producto ingresado // El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente // Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto while (fread(&indice, sizeof(Indice), 1, archivoIndice)) { if (indice.id == codigo) { // Posicionar el cursor en el archivo de productos archivoProductos = fopen("productos.dat", "rb"); if (archivoProductos == NULL) { printf("Error al abrir el archivo de productos "); return; } fseek(archivoProductos, indice.posicion, SEEK_SET); // Leer los datos del producto y mostrarlos en pantalla fread(&producto, sizeof(Producto), 1, archivoProductos); printf("ID: %d ", producto.id); printf("Nombre: %s ", producto.nombre); printf("Precio: %f ", producto.precio); printf("Cantidad: %d ", producto.cantidad); fclose(archivoProductos); fclose(archivoIndice); return; } } // Si no se encontró un índice correspondiente al codigo de producto ingresado printf("No se encontró el producto con el codigo ingresado "); fclose(archivoIndice); } int main() { crearArchivos(); // Insertamos tres registros de prueba insertarFila(); insertarFila(); insertarFila(); buscarProducto(); }
@@diegomoissetdeespanes Muchas Gracias, Se lo agradezco, el codigo me sirve bastante para adaptarlo a mi proyecto y agregarle otras cosas ya que muy pocos explican el tema de archivos indexados!!
@@diegomoissetdeespanes Disculpe me surge otro problema como haria para modificar este tipo de archivos, ya que he estado realizando pruebas y logro modificar el archivo principal,pero no he encontrado la forma de actualizar el archivo de indices, por ejemplo cuando modifico el codigo y lo vuelvo a buscar no me funciona ya que el archivo indice no se actualiza, disculpe la molestia si me puede ayudar se lo agradeceria.
@@bearose710 #include #include // Definición de estructuras typedef struct { int id; char nombre[50]; float precio; int cantidad; } Producto; typedef struct { int id; long posicion; } Indice; void crearArchivos() { FILE* archivoProductos; FILE* archivoIndice; archivoProductos = fopen("productos.dat", "wb"); archivoIndice = fopen("indice.dat", "wb"); if (archivoProductos == NULL || archivoIndice == NULL) { printf("Error al abrir el archivo"); return; } fclose(archivoProductos); fclose(archivoIndice); } // Función para insertar una fila en el archivo de productos y en el archivo de índice void insertarFila() { FILE* archivoProductos; FILE* archivoIndice; Producto producto; Indice indice; long posicion; archivoProductos = fopen("productos.dat", "ab"); archivoIndice = fopen("indice.dat", "ab"); if (archivoProductos == NULL || archivoIndice == NULL) { printf("Error al abrir el archivo"); return; } // Pedir al usuario que ingrese los datos del nuevo producto printf("Ingrese los datos del nuevo producto: "); printf("ID: "); scanf("%d", &producto.id); printf("Nombre: "); scanf("%s", producto.nombre); printf("Precio: "); scanf("%f", &producto.precio); printf("Cantidad: "); scanf("%d", &producto.cantidad); // Escribir el nuevo producto en el archivo de productos fwrite(&producto, sizeof(Producto), 1, archivoProductos); // Obtener la posición en el archivo de productos del nuevo producto posicion = ftell(archivoProductos) - sizeof(Producto); // Escribir el nuevo índice en el archivo de índices indice.id = producto.id; // Escribir el nuevo índice en el archivo de índices indice.posicion = posicion; fwrite(&indice, sizeof(Indice), 1, archivoIndice); fclose(archivoProductos); fclose(archivoIndice); } void buscarProducto() { FILE* archivoProductos; FILE* archivoIndice; Indice indice; Producto producto; int codigo; archivoIndice = fopen("indice.dat", "rb"); if (archivoIndice == NULL) { printf("Error al abrir el archivo de indice "); return; } // Pedir al usuario que ingrese el codigo del producto a buscar printf("Ingrese el codigo del producto a buscar: "); scanf("%d", &codigo); // Buscar el indice correspondiente al codigo de producto ingresado // El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente // Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto while (fread(&indice, sizeof(Indice), 1, archivoIndice)) { if (indice.id == codigo) { // Posicionar el cursor en el archivo de productos archivoProductos = fopen("productos.dat", "rb"); if (archivoProductos == NULL) { printf("Error al abrir el archivo de productos "); return; } fseek(archivoProductos, indice.posicion, SEEK_SET); // Leer los datos del producto y mostrarlos en pantalla fread(&producto, sizeof(Producto), 1, archivoProductos); printf("ID: %d ", producto.id); printf("Nombre: %s ", producto.nombre); printf("Precio: %f ", producto.precio); printf("Cantidad: %d ", producto.cantidad); fclose(archivoProductos); fclose(archivoIndice); return; } } // Si no se encontró un índice correspondiente al codigo de producto ingresado printf("No se encontró el producto con el codigo ingresado "); fclose(archivoIndice); } void modificarProducto() { FILE* archivoProductos; FILE* archivoIndice; Indice indice; Producto producto; int codigo; long posicion; archivoIndice = fopen("indice.dat", "rb+"); if (archivoIndice == NULL) { printf("Error al abrir el archivo de indice "); return; } // Pedir al usuario que ingrese el codigo del producto a modificar printf("Ingrese el codigo del producto a modificar: "); scanf("%d", &codigo); // Buscar el indice correspondiente al codigo de producto ingresado // El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente // Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto while (fread(&indice, sizeof(Indice), 1, archivoIndice)) { if (indice.id == codigo) { // Posicionar el cursor en el archivo de productos archivoProductos = fopen("productos.dat", "rb+"); if (archivoProductos == NULL) { printf("Error al abrir el archivo de productos "); return; } fseek(archivoProductos, indice.posicion, SEEK_SET); // Leer los datos del producto y mostrarlos en pantalla fread(&producto, sizeof(Producto), 1, archivoProductos); printf("ID: %d ", producto.id); printf("Nombre: %s ", producto.nombre); printf("Precio: %f ", producto.precio); printf("Cantidad: %d ", producto.cantidad); // Modificar los datos del producto printf("Ingrese los nuevos datos del producto: "); printf("ID: "); scanf("%d", &producto.id); printf("Nombre: "); scanf("%s", producto.nombre); printf("Precio: "); scanf("%f", &producto.precio); printf("Cantidad: "); scanf("%d", &producto.cantidad); // Escribir el producto modificado en el archivo de productos fseek(archivoProductos, indice.posicion, SEEK_SET); fwrite(&producto, sizeof(Producto), 1, archivoProductos); // Actualizar el indice en el archivo de indice indice.id = producto.id; indice.posicion = ftell(archivoProductos) - sizeof(Producto); fseek(archivoIndice, -sizeof(Indice), SEEK_CUR); fwrite(&indice, sizeof(Indice), 1, archivoIndice); fclose(archivoProductos); fclose(archivoIndice); return; } } // Si no se encontró un índice correspondiente al codigo de producto ingresado printf("No se encontró el producto con el codigo ingresado "); fclose(archivoIndice); } int main() { crearArchivos(); // Insertamos un registro de prueba insertarFila(); buscarProducto(); modificarProducto(); buscarProducto(); }
Hola, create otro campo en la structura, por ejemplo. typedef struct{ int codigo; char descripcion[41]; float precioCompra; float precioVenta; }producto;
Amigo estoy trabajando con un archivo de texto, quiero hacer la funcion de consulta como seria en este caso? Porque hago lo del video y no me funciona... void consultarNP(){ char nom[15]; int band=0; personas p; FILE *fp2; fp2 = fopen("PersonasInfo.txt", "r"); printf("Digita nombre a buscar "); fgets(nom,15,stdin); verif(nom); fread(&p,sizeof(personas),1,fp2);
while (!feof(fp2)){ if (strstr(nom,p.nombre)!=NULL) { printf(" Nombre = %s",p.nombre); printf("Cedula = %d",p.diab); band = 1; break; } fread(&p,sizeof(personas),1,fp2); }
fclose(fp2); } y esta es mi estruct typedef struct{ long int cedula; char nombre[15]; int diab; int mesb; int anob; }personas;
En principio esta bien el algoritmo de búsqueda, yo lo pruebo cargando 3 registros y luego consultando cualquiera de ellos y funciona: #include #include #include typedef struct{ long int cedula; char nombre[15]; int diab; int mesb; int anob; }personas; void crear() { FILE *arch; arch=fopen("PersonasInfo.txt","wb"); if (arch==NULL) exit(1); fclose(arch); } void cargar() { FILE *arch; arch=fopen("PersonasInfo.txt","ab"); if (arch==NULL) exit(1); personas persona; printf("Ingrese cedula de la persona:"); scanf("%ld",&persona.cedula); fflush(stdin); printf("Ingrese el nombre :"); gets(persona.nombre); printf("Ingrese dia:"); scanf("%i",&persona.diab); printf("Ingrese mes:"); scanf("%i",&persona.mesb); printf("Ingrese anio:"); scanf("%i",&persona.anob); fwrite(&persona, sizeof(personas), 1, arch); fclose(arch); } void consultarNP(){ char nom[15]; int band=0; personas p; FILE *fp2; fp2 = fopen("PersonasInfo.txt", "r"); printf("Digita nombre a buscar "); fgets(nom,15,stdin); //verif(nom); fread(&p,sizeof(personas),1,fp2); while (!feof(fp2)){ if (strstr(nom,p.nombre)!=NULL) { printf(" Nombre = %s",p.nombre); printf(" Cedula = %ld",p.cedula); printf(" Dia = %d",p.diab); printf(" Mes = %d",p.mesb); printf(" Anio = %d",p.anob); band = 1; break; } fread(&p,sizeof(personas),1,fp2); } fclose(fp2); } void main() { crear(); cargar(); cargar(); cargar(); consultarNP(); }
@@diegomoissetdeespanes Gracias amigo, la cosa es que yo ajuro tengo que trabajar con archivos txt. Y bueno cambie los fread por fscanf, solo tengo una duda. Sabras por que al hacer dicho cambio cuando le das a consultar y tiene mas de un registro no lee los demas? O no los muestra por asi decirlo, si yo tengo el registro a con el codigo 1 y el registro b con el codigo 2 si quiero consultar codigo 2 me dice que no existe
Muy buena explicación! Vengo aprendiendo bastante gracias a tus videos. Tengo una duda, ¿Cómo seria el caso en el que tengo estructuras anidadas? Porque estoy intentando resolver lo siguiente: modificar la fecha de nacimiento de una persona. Serian dos estructuras, persona, y fecha (fecha estaría dentro de la estructura persona). Fecha contiene día, mes, año.
Un ejemplo: #include #include #include typedef struct { int dia; int mes; int anio; }tfecha; typedef struct { char nombre[81]; tfecha fechaNac; } tpersona; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("personas.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("personas.dat","ab"); if (arch==NULL) exit(1); tpersona persona; printf("Ingrese el nombre de la persona:"); fflush(stdin); gets(persona.nombre); printf("Ingrese dia de nacimiento:"); scanf("%d",&persona.fechaNac.dia); printf("Ingrese mes de nacimiento:"); scanf("%d",&persona.fechaNac.mes); printf("Ingrese año de nacimiento:"); scanf("%d",&persona.fechaNac.anio); fwrite(&persona, sizeof(tpersona), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("personas.dat","rb"); if (arch==NULL) exit(1); tpersona persona; fread(&persona, sizeof(tpersona), 1, arch); while(!feof(arch)) { printf("%s %i/%i/%i ", persona.nombre, persona.fechaNac.dia,persona.fechaNac.mes,persona.fechaNac.anio); fread(&persona, sizeof(tpersona), 1, arch); } fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"personas.dat\" "); printf("2 - Carga de registros de tipo tpersona "); printf("3 - Listado completo de personas. "); printf("4 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; } } while (opcion!=4); return 0; }
Para borrar un registro lo que se hace es un borrado lógico agregando otro campo que indique si el registro esta borrado o no. (En último caso se debe crear luego un nuevo archivo copiando solo los registros que tienen en el campo borrado el valor 0) El algoritmo modificado es: #include #include #include typedef struct { int codigo; char descripcion[41]; float precio; int borrado; // 0=existe 1=borrado } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); producto.borrado=0; fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); } fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void borrar() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a borrar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { producto.borrado=1; int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se borro dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Borrar. "); printf("7 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; case 6:borrar(); break; } } while (opcion!=7); return 0; }
Mira los 4 vídeos anteriores del curso. ftell(); devuelve la posición actual del puntero en el archivo y fseek(); sirve para mover el puntero a través del archivo.
cuando fread termina de leer un bloque, apunta al final del mismo y no al inicio. entonces para guardar la posición del bloque que acaba de leer, tenés que ir al inicio del bloque. esto se hace preguntando con ftell la posicion en bytes donde quedó fread y restándole el tamaño en bytes de un registro de tipo producto
#include #include #include typedef struct { int codigo; char descripcion[41]; float precio; } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; } } while (opcion!=6); return 0; }
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no. Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.) El algoritmo modificado es: #include #include #include typedef struct { int codigo; char descripcion[41]; float precio; int borrado; // 0=existe 1=borrado } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); producto.borrado=0; fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); } fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void borrar() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a borrar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { producto.borrado=1; int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se borro dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Borrar. "); printf("7 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; case 6:borrar(); break; } } while (opcion!=7); return 0; }
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no. Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.) El algoritmo modificado es: #include #include #include typedef struct { int codigo; char descripcion[41]; float precio; int borrado; // 0=existe 1=borrado } tproducto; void continuar() { printf("Presione una tecla para continuar
"); getch(); } void crear() { FILE *arch; arch=fopen("productos.dat","wb"); if (arch==NULL) exit(1); fclose(arch); continuar(); } void cargar() { FILE *arch; arch=fopen("productos.dat","ab"); if (arch==NULL) exit(1); tproducto producto; printf("Ingrese el codigo del producto:"); scanf("%i",&producto.codigo); fflush(stdin); printf("Ingrese el nombre del producto:"); gets(producto.descripcion); printf("Ingrese precio:"); scanf("%f",&producto.precio); producto.borrado=0; fwrite(&producto, sizeof(tproducto), 1, arch); fclose(arch); continuar(); } void listado() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); tproducto producto; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); } fread(&producto, sizeof(tproducto), 1, arch); } fclose(arch); continuar(); } void consulta() { FILE *arch; arch=fopen("productos.dat","rb"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a consultar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void modificacion() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a modificar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { printf("%i %s %0.2f ", producto.codigo, producto.descripcion, producto.precio); printf("Ingrese nuevo precio:"); scanf("%f",&producto.precio); int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se modifico el precio para dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } void borrar() { FILE *arch; arch=fopen("productos.dat","r+b"); if (arch==NULL) exit(1); printf("Ingrese el codigo de producto a borrar:"); int cod; scanf("%i", &cod); tproducto producto; int existe=0; fread(&producto, sizeof(tproducto), 1, arch); while(!feof(arch)) { if (cod==producto.codigo && producto.borrado==0) { producto.borrado=1; int pos=ftell(arch)-sizeof(tproducto); fseek(arch,pos,SEEK_SET); fwrite(&producto, sizeof(tproducto), 1, arch); printf("Se borro dicho producto. "); existe=1; break; } fread(&producto, sizeof(tproducto), 1, arch); } if (existe==0) printf("No existe un producto con dicho codigo "); fclose(arch); continuar(); } int main() { int opcion; do { printf("1 - Crear un archivo binario llamado \"productos.dat\" "); printf("2 - Carga de registros de tipo tproducto "); printf("3 - Listado completo de productos. "); printf("4 - Consulta de un producto por su codigo. "); printf("5 - Modificacion del precio de un producto. "); printf("6 - Borrar. "); printf("7 - Finalizar
"); printf("Ingrese su opcion:"); scanf("%i",&opcion); switch (opcion) { case 1:crear(); break; case 2:cargar(); break; case 3:listado(); break; case 4:consulta(); break; case 5:modificacion(); break; case 6:borrar(); break; } } while (opcion!=7); return 0; }
Sos un Genio Diego, gracias totales. Sin vos no se como hubiese hecho para aprender a manejar C. Tengo que volver a ver unos videos de cosas que saltee porque no me las pedian en el examen. Voy a ponerte like en todos los videos. Mil gracias. Hoy rindo, espero recordar todo. slds
Excelente, mi profesor explicando es horrible sobre todo este tema y vos lo hiciste re fácil de entender sos el mejor!!!!!!!!!
Saludos Gabriel.
Profe usted es un crack, me sirvió todo incluso lo modifique a mi gusto y funciono nuevamente.
¡Maestrooooo!!
uff, no encontraba la manera de modificar el registro !! muchas gracias profesooooor !!
la verdad me encantan sus videos, ojalá siga subiendo videos de este maravilloso lenguaje
Saludos Miguel.
Que buena manera de explicarlo! Siga asi , enseñando más cosas sobre el lenguaje C/C++ :D! Saludos!
Gracias, saludos!
ES USTED UN CRACK!!!! Sin su ayuda no hubiera podido resolver mi tarea, mis respetos!
Saludos.
Me gusto mucho la explicacion, sin tanta vuelta y bien explicado
Ya casi termino este curso. Muchas gracias por todo lo que compartís!
Excelente video, me srivió para terminar mi proyecto
Excelente el curso!!!! aprendí un monton!!! Lo aplaudo!
Gracias por compartir tus conocimientos....muy agradecido!!!!!!!
Saludos Jose.
Amigo te amo.
Le agradezco mucho, encontré cómo usar varias funciones que tenia en duda c:
muy buen video , la verdad me ayudo bastante , sigue asi
Saludos Maty
muchas gracias justo andaba buscando un ejercicio asi, me sirvio mucho
printf("Incríble video, me sirvio mucho. Gracias");
#include
#include
int main() {
int f;
char cad[]="Tbmvept";
for(f=0;f
Buen video bro saludos desde Panamá !!
Saludos y gracias
Muy útil, gracias!
Sos un fenomeno, gracias, me salvaste.
Saludos Oscar.
sos capo diego te re banco
Quisiera encontrar la forma de validar el UserName de mi carga , si en la carga de datos siguiente se repite el nombre que no me deje seguir cargando hasta que lo modifique? Tenes algo sobre ese tema?? Estoy haciendo un sistema de clientes y pedidos.
!!Que buena forma de explicar un semestre entero de programacion en c!!
una duda, ¿como podria eliminar un registro del archivo?
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no.
Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.)
El algoritmo modificado es:
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
int borrado; // 0=existe 1=borrado
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
producto.borrado=0;
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
}
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void borrar()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a borrar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
producto.borrado=1;
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se borro dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Borrar.
");
printf("7 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
case 6:borrar();
break;
}
} while (opcion!=7);
return 0;
}
@@diegomoissetdeespanes lo probé y no me elimina nada:(
@@gabrielreyes8725 Se pueden eliminar los registros de un archivo de dos maneras: borrado lógico o borrado físico. No sé si hallaste la forma de hacerlo finalmente pero yo tengo una manera de hacer el borrado físico y es mediante una función que va a pedir que ingreses el código del producto que se desea eliminar. Lo que se pretende hacer es comparar el código del producto ingresado con el código de cada registro y para aquellos códigos que sean diferentes al código ingresado los iremos guardando en un archivo nuevo. Finalmente cerramos los archivos y eliminamos con la función remove() el archivo original y renombramos el nuevo archivo con la función rename(). Te dejo el ejemplo de la función:
void deleteproduct(){
FILE *archivo;
FILE *temporal;
archivo=fopen("Catálogo de productos.dat", "rb");
temporal=fopen("temporal.dat", "wb");
if(archivo==NULL || temporal==NULL)
printf("ERROR: uno de los dos archivos no ha sido encontrado.
");
printf("Ingrese el código del producto que desea eliminar: ");
int codigo;
scanf("%d", &codigo);
char a;
printf("¿Desea continuar con la eliminación del producto? [S/N]
");
fflush(stdin);
scanf("%c", &a);
if(a=='S' || a=='s'){
product producto;
fread(&producto, sizeof(product), 1, archivo);
while(!feof(archivo)){
if(producto.code!=codigo)
fwrite(&producto, sizeof(product), 1, temporal);
fread(&producto, sizeof(product), 1, archivo);
}
printf("El producto ha sido eliminado satisfactoriamente.
");
fclose(archivo);
fclose(temporal);
remove("Catálogo de productos.dat");
rename("temporal.dat", "Catálogo de productos.dat");
printf("¿Desea eliminar otro producto? [S/N]
");
fflush(stdin);
scanf("%c", &a);
if(a=='S' || a=='s'){
deleteproduct();
} else printf("Proceso terminado.
");;
}
else if(a=='N' || a=='n')
printf("Proceso cancelado.
");
}
Muchas gracias, esta super claro.
Saludos Doug.
Disculpa Diego, como podria hacer para eliminar un registro.
@@dougnaho Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no.
Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.)
El algoritmo modificado es:
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
int borrado; // 0=existe 1=borrado
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
producto.borrado=0;
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
}
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void borrar()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a borrar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
producto.borrado=1;
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se borro dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Borrar.
");
printf("7 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
case 6:borrar();
break;
}
} while (opcion!=7);
return 0;
}
@diego, Mil, mil, mil pero en serio mil gracias. agradezco mucho la manera en poder compartir tu conocimiento de una manera muy clara y detallada, y mas aún el hecho de ayudar de una forma fraternal. Tienes un amigo en Guatemala, saludos y bendiciones.
hola! quería saber como se aria en caso que quisiera modificar un dato pero el valor nuevo lo tengo ya en una variable, es decir sin preguntar al usuario con el scanf
Esto se puede hacer en c++ es parecido no ??
Como podria sumar lo precios de los productos??
¿Tiene algún video que hable de cómo almacenar una cadena de caracteres, que son leidos de un archivo y que deben ser guardados en un arreglo de estructuras?
Hola buen curso, como seria el algoritmo con un archivo secuencial indexado, ya que he estado viendo que utilizan dos archivos uno para los datos del archivo y otro para el area de indices con una clave y la direccion, si pudiera darme alguna informacion o algun ejemplo de como seria el algoritmo en lenguaje c, ya que tengo que hacer un proyecto con este tipo de archivos se lo agradeceria...
Es un tema bastante más complejo que el video sobre archivos binarios.
Pero te puede servir un bosquejo de como implementar dicho algoritmo con este ejemplo:
#include
#include
// Definición de estructuras
typedef struct {
int id;
char nombre[50];
float precio;
int cantidad;
} Producto;
typedef struct {
int id;
long posicion;
} Indice;
void crearArchivos() {
FILE* archivoProductos;
FILE* archivoIndice;
archivoProductos = fopen("productos.dat", "wb");
archivoIndice = fopen("indice.dat", "wb");
if (archivoProductos == NULL || archivoIndice == NULL) {
printf("Error al abrir el archivo");
return;
}
fclose(archivoProductos);
fclose(archivoIndice);
}
// Función para insertar una fila en el archivo de productos y en el archivo de índice
void insertarFila() {
FILE* archivoProductos;
FILE* archivoIndice;
Producto producto;
Indice indice;
long posicion;
archivoProductos = fopen("productos.dat", "ab");
archivoIndice = fopen("indice.dat", "ab");
if (archivoProductos == NULL || archivoIndice == NULL) {
printf("Error al abrir el archivo");
return;
}
// Pedir al usuario que ingrese los datos del nuevo producto
printf("Ingrese los datos del nuevo producto:
");
printf("ID: ");
scanf("%d", &producto.id);
printf("Nombre: ");
scanf("%s", producto.nombre);
printf("Precio: ");
scanf("%f", &producto.precio);
printf("Cantidad: ");
scanf("%d", &producto.cantidad);
// Escribir el nuevo producto en el archivo de productos
fwrite(&producto, sizeof(Producto), 1, archivoProductos);
// Obtener la posición en el archivo de productos del nuevo producto
posicion = ftell(archivoProductos) - sizeof(Producto);
// Escribir el nuevo índice en el archivo de índices
indice.id = producto.id;
// Escribir el nuevo índice en el archivo de índices
indice.posicion = posicion;
fwrite(&indice, sizeof(Indice), 1, archivoIndice);
fclose(archivoProductos);
fclose(archivoIndice);
}
void buscarProducto() {
FILE* archivoProductos;
FILE* archivoIndice;
Indice indice;
Producto producto;
int codigo;
archivoIndice = fopen("indice.dat", "rb");
if (archivoIndice == NULL) {
printf("Error al abrir el archivo de indice
");
return;
}
// Pedir al usuario que ingrese el codigo del producto a buscar
printf("Ingrese el codigo del producto a buscar: ");
scanf("%d", &codigo);
// Buscar el indice correspondiente al codigo de producto ingresado
// El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente
// Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto
while (fread(&indice, sizeof(Indice), 1, archivoIndice)) {
if (indice.id == codigo) {
// Posicionar el cursor en el archivo de productos
archivoProductos = fopen("productos.dat", "rb");
if (archivoProductos == NULL) {
printf("Error al abrir el archivo de productos
");
return;
}
fseek(archivoProductos, indice.posicion, SEEK_SET);
// Leer los datos del producto y mostrarlos en pantalla
fread(&producto, sizeof(Producto), 1, archivoProductos);
printf("ID: %d
", producto.id);
printf("Nombre: %s
", producto.nombre);
printf("Precio: %f
", producto.precio);
printf("Cantidad: %d
", producto.cantidad);
fclose(archivoProductos);
fclose(archivoIndice);
return;
}
}
// Si no se encontró un índice correspondiente al codigo de producto ingresado
printf("No se encontró el producto con el codigo ingresado
");
fclose(archivoIndice);
}
int main() {
crearArchivos();
// Insertamos tres registros de prueba
insertarFila();
insertarFila();
insertarFila();
buscarProducto();
}
@@diegomoissetdeespanes Muchas Gracias, Se lo agradezco, el codigo me sirve bastante para adaptarlo a mi proyecto y agregarle otras cosas ya que muy pocos explican el tema de archivos indexados!!
@@diegomoissetdeespanes Disculpe me surge otro problema como haria para modificar este tipo de archivos, ya que he estado realizando pruebas y logro modificar el archivo principal,pero no he encontrado la forma de actualizar el archivo de indices, por ejemplo cuando modifico el codigo y lo vuelvo a buscar no me funciona ya que el archivo indice no se actualiza, disculpe la molestia si me puede ayudar se lo agradeceria.
@@bearose710
#include
#include
// Definición de estructuras
typedef struct {
int id;
char nombre[50];
float precio;
int cantidad;
} Producto;
typedef struct {
int id;
long posicion;
} Indice;
void crearArchivos() {
FILE* archivoProductos;
FILE* archivoIndice;
archivoProductos = fopen("productos.dat", "wb");
archivoIndice = fopen("indice.dat", "wb");
if (archivoProductos == NULL || archivoIndice == NULL) {
printf("Error al abrir el archivo");
return;
}
fclose(archivoProductos);
fclose(archivoIndice);
}
// Función para insertar una fila en el archivo de productos y en el archivo de índice
void insertarFila() {
FILE* archivoProductos;
FILE* archivoIndice;
Producto producto;
Indice indice;
long posicion;
archivoProductos = fopen("productos.dat", "ab");
archivoIndice = fopen("indice.dat", "ab");
if (archivoProductos == NULL || archivoIndice == NULL) {
printf("Error al abrir el archivo");
return;
}
// Pedir al usuario que ingrese los datos del nuevo producto
printf("Ingrese los datos del nuevo producto:
");
printf("ID: ");
scanf("%d", &producto.id);
printf("Nombre: ");
scanf("%s", producto.nombre);
printf("Precio: ");
scanf("%f", &producto.precio);
printf("Cantidad: ");
scanf("%d", &producto.cantidad);
// Escribir el nuevo producto en el archivo de productos
fwrite(&producto, sizeof(Producto), 1, archivoProductos);
// Obtener la posición en el archivo de productos del nuevo producto
posicion = ftell(archivoProductos) - sizeof(Producto);
// Escribir el nuevo índice en el archivo de índices
indice.id = producto.id;
// Escribir el nuevo índice en el archivo de índices
indice.posicion = posicion;
fwrite(&indice, sizeof(Indice), 1, archivoIndice);
fclose(archivoProductos);
fclose(archivoIndice);
}
void buscarProducto() {
FILE* archivoProductos;
FILE* archivoIndice;
Indice indice;
Producto producto;
int codigo;
archivoIndice = fopen("indice.dat", "rb");
if (archivoIndice == NULL) {
printf("Error al abrir el archivo de indice
");
return;
}
// Pedir al usuario que ingrese el codigo del producto a buscar
printf("Ingrese el codigo del producto a buscar: ");
scanf("%d", &codigo);
// Buscar el indice correspondiente al codigo de producto ingresado
// El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente
// Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto
while (fread(&indice, sizeof(Indice), 1, archivoIndice)) {
if (indice.id == codigo) {
// Posicionar el cursor en el archivo de productos
archivoProductos = fopen("productos.dat", "rb");
if (archivoProductos == NULL) {
printf("Error al abrir el archivo de productos
");
return;
}
fseek(archivoProductos, indice.posicion, SEEK_SET);
// Leer los datos del producto y mostrarlos en pantalla
fread(&producto, sizeof(Producto), 1, archivoProductos);
printf("ID: %d
", producto.id);
printf("Nombre: %s
", producto.nombre);
printf("Precio: %f
", producto.precio);
printf("Cantidad: %d
", producto.cantidad);
fclose(archivoProductos);
fclose(archivoIndice);
return;
}
}
// Si no se encontró un índice correspondiente al codigo de producto ingresado
printf("No se encontró el producto con el codigo ingresado
");
fclose(archivoIndice);
}
void modificarProducto() {
FILE* archivoProductos;
FILE* archivoIndice;
Indice indice;
Producto producto;
int codigo;
long posicion;
archivoIndice = fopen("indice.dat", "rb+");
if (archivoIndice == NULL) {
printf("Error al abrir el archivo de indice
");
return;
}
// Pedir al usuario que ingrese el codigo del producto a modificar
printf("Ingrese el codigo del producto a modificar: ");
scanf("%d", &codigo);
// Buscar el indice correspondiente al codigo de producto ingresado
// El archivo de indice es mas pequeno y por lo tanto lo vamos a encontrar mas rapidamente
// Se pueden organizar el archivo indice como un arbol para localizar el codigo de producto
while (fread(&indice, sizeof(Indice), 1, archivoIndice)) {
if (indice.id == codigo) {
// Posicionar el cursor en el archivo de productos
archivoProductos = fopen("productos.dat", "rb+");
if (archivoProductos == NULL) {
printf("Error al abrir el archivo de productos
");
return;
}
fseek(archivoProductos, indice.posicion, SEEK_SET);
// Leer los datos del producto y mostrarlos en pantalla
fread(&producto, sizeof(Producto), 1, archivoProductos);
printf("ID: %d
", producto.id);
printf("Nombre: %s
", producto.nombre);
printf("Precio: %f
", producto.precio);
printf("Cantidad: %d
", producto.cantidad);
// Modificar los datos del producto
printf("Ingrese los nuevos datos del producto:
");
printf("ID: ");
scanf("%d", &producto.id);
printf("Nombre: ");
scanf("%s", producto.nombre);
printf("Precio: ");
scanf("%f", &producto.precio);
printf("Cantidad: ");
scanf("%d", &producto.cantidad);
// Escribir el producto modificado en el archivo de productos
fseek(archivoProductos, indice.posicion, SEEK_SET);
fwrite(&producto, sizeof(Producto), 1, archivoProductos);
// Actualizar el indice en el archivo de indice
indice.id = producto.id;
indice.posicion = ftell(archivoProductos) - sizeof(Producto);
fseek(archivoIndice, -sizeof(Indice), SEEK_CUR);
fwrite(&indice, sizeof(Indice), 1, archivoIndice);
fclose(archivoProductos);
fclose(archivoIndice);
return;
}
}
// Si no se encontró un índice correspondiente al codigo de producto ingresado
printf("No se encontró el producto con el codigo ingresado
");
fclose(archivoIndice);
}
int main() {
crearArchivos();
// Insertamos un registro de prueba
insertarFila();
buscarProducto();
modificarProducto();
buscarProducto();
}
@@diegomoissetdeespanes Gracias otra vez!!!!
Ayudenme necesito hacer una interfaz de tienda en la que almacene 10 objetos y los que se pueda mostrar la lista borrar y modificar
Buenísimo tutorial!
Gracias!
buenas como le hago para que aparte ter otro precio, por ejemplo precio de compra y precio de venta o sea agregar otro precio al producto ?
Hola, create otro campo en la structura, por ejemplo.
typedef struct{
int codigo;
char descripcion[41];
float precioCompra;
float precioVenta;
}producto;
Amigo estoy trabajando con un archivo de texto, quiero hacer la funcion de consulta como seria en este caso? Porque hago lo del video y no me funciona...
void consultarNP(){
char nom[15];
int band=0;
personas p;
FILE *fp2;
fp2 = fopen("PersonasInfo.txt", "r");
printf("Digita nombre a buscar ");
fgets(nom,15,stdin);
verif(nom);
fread(&p,sizeof(personas),1,fp2);
while (!feof(fp2)){
if (strstr(nom,p.nombre)!=NULL)
{
printf("
Nombre = %s",p.nombre);
printf("Cedula = %d",p.diab);
band = 1;
break;
}
fread(&p,sizeof(personas),1,fp2);
}
fclose(fp2);
}
y esta es mi estruct
typedef struct{
long int cedula;
char nombre[15];
int diab;
int mesb;
int anob;
}personas;
En principio esta bien el algoritmo de búsqueda, yo lo pruebo cargando 3 registros y luego consultando cualquiera de ellos y funciona:
#include
#include
#include
typedef struct{
long int cedula;
char nombre[15];
int diab;
int mesb;
int anob;
}personas;
void crear()
{
FILE *arch;
arch=fopen("PersonasInfo.txt","wb");
if (arch==NULL)
exit(1);
fclose(arch);
}
void cargar()
{
FILE *arch;
arch=fopen("PersonasInfo.txt","ab");
if (arch==NULL)
exit(1);
personas persona;
printf("Ingrese cedula de la persona:");
scanf("%ld",&persona.cedula);
fflush(stdin);
printf("Ingrese el nombre :");
gets(persona.nombre);
printf("Ingrese dia:");
scanf("%i",&persona.diab);
printf("Ingrese mes:");
scanf("%i",&persona.mesb);
printf("Ingrese anio:");
scanf("%i",&persona.anob);
fwrite(&persona, sizeof(personas), 1, arch);
fclose(arch);
}
void consultarNP(){
char nom[15];
int band=0;
personas p;
FILE *fp2;
fp2 = fopen("PersonasInfo.txt", "r");
printf("Digita nombre a buscar ");
fgets(nom,15,stdin);
//verif(nom);
fread(&p,sizeof(personas),1,fp2);
while (!feof(fp2)){
if (strstr(nom,p.nombre)!=NULL)
{
printf("
Nombre = %s",p.nombre);
printf("
Cedula = %ld",p.cedula);
printf("
Dia = %d",p.diab);
printf("
Mes = %d",p.mesb);
printf("
Anio = %d",p.anob);
band = 1;
break;
}
fread(&p,sizeof(personas),1,fp2);
}
fclose(fp2);
}
void main()
{
crear();
cargar();
cargar();
cargar();
consultarNP();
}
@@diegomoissetdeespanes Gracias amigo, la cosa es que yo ajuro tengo que trabajar con archivos txt. Y bueno cambie los fread por fscanf, solo tengo una duda. Sabras por que al hacer dicho cambio cuando le das a consultar y tiene mas de un registro no lee los demas? O no los muestra por asi decirlo, si yo tengo el registro a con el codigo 1 y el registro b con el codigo 2 si quiero consultar codigo 2 me dice que no existe
@@agustinlyon8173 con archivos de texto no podemos grabar registros, solo podemos grabar texto.
Muy buena explicación! Vengo aprendiendo bastante gracias a tus videos.
Tengo una duda, ¿Cómo seria el caso en el que tengo estructuras anidadas?
Porque estoy intentando resolver lo siguiente: modificar la fecha de nacimiento de una persona. Serian dos estructuras, persona, y fecha (fecha estaría dentro de la estructura persona). Fecha contiene día, mes, año.
Un ejemplo:
#include
#include
#include
typedef struct {
int dia;
int mes;
int anio;
}tfecha;
typedef struct {
char nombre[81];
tfecha fechaNac;
} tpersona;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("personas.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("personas.dat","ab");
if (arch==NULL)
exit(1);
tpersona persona;
printf("Ingrese el nombre de la persona:");
fflush(stdin);
gets(persona.nombre);
printf("Ingrese dia de nacimiento:");
scanf("%d",&persona.fechaNac.dia);
printf("Ingrese mes de nacimiento:");
scanf("%d",&persona.fechaNac.mes);
printf("Ingrese año de nacimiento:");
scanf("%d",&persona.fechaNac.anio);
fwrite(&persona, sizeof(tpersona), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("personas.dat","rb");
if (arch==NULL)
exit(1);
tpersona persona;
fread(&persona, sizeof(tpersona), 1, arch);
while(!feof(arch))
{
printf("%s %i/%i/%i
", persona.nombre, persona.fechaNac.dia,persona.fechaNac.mes,persona.fechaNac.anio);
fread(&persona, sizeof(tpersona), 1, arch);
}
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"personas.dat\"
");
printf("2 - Carga de registros de tipo tpersona
");
printf("3 - Listado completo de personas.
");
printf("4 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
}
} while (opcion!=4);
return 0;
}
@@diegomoissetdeespanes Muchas gracias!!
@@gonzaloagudo exactamente
te amo
Buen video!
Gracias.
Necesito ayuda, como seria posible borrar un registro?? En lugar de modificarlo que sea borrarlo por completo como si nunca se hubiera escrito
Para borrar un registro lo que se hace es un borrado lógico agregando otro campo
que indique si el registro esta borrado o no.
(En último caso se debe crear luego un nuevo archivo copiando solo los registros
que tienen en el campo borrado el valor 0)
El algoritmo modificado es:
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
int borrado; // 0=existe 1=borrado
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
producto.borrado=0;
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
}
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void borrar()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a borrar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
producto.borrado=1;
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se borro dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Borrar.
");
printf("7 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
case 6:borrar();
break;
}
} while (opcion!=7);
return 0;
}
¿Me podría explicar las líneas: pos= ftell(arch) - sizeof(tproducto); fseek(arch, pos, SEEK_SET);?
Mira los 4 vídeos anteriores del curso.
ftell(); devuelve la posición actual del puntero en el archivo y fseek(); sirve para mover el puntero a través del archivo.
cuando fread termina de leer un bloque, apunta al final del mismo y no al inicio.
entonces para guardar la posición del bloque que acaba de leer, tenés que ir al inicio del bloque.
esto se hace preguntando con ftell la posicion en bytes donde quedó fread y restándole el tamaño en bytes de un registro de tipo producto
como puedo buscar el producto por nombre y no por codigo?
void consultaPorNombre()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el nombre del producto a consultar:");
char aux[41];
fflush(stdin);
gets(aux);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (strcmp(producto.descripcion,aux)==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho nombre
");
fclose(arch);
continuar();
}
@@diegomoissetdeespanes muchas gracias me sirvió de mucho y aprendí muchísimo ya me suscribo a tu canal
disculpe, tiene el codigo de modificación?
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
}
} while (opcion!=6);
return 0;
}
Se siente raro que la voz de Dtoke te enseñe a programar jaja
No sé si este canal sigue activo, pero tengo una duda
Hay manera de salir de ese while sin necesidad de usar el break; ?
Podemos salir del while sin el break disponiendo una condición compuesta:
int existe=0;
while(!feof(arch) && existe==0)
{
....
}
@@diegomoissetdeespanes Por alguna razón no funciona de esa forma.. rarisimo
bro con tu pregunta me salvaste la vida
@@josevalencia3539 buenaaa
@@wooziplay sabes como podría crear y cargar datos en la misma función crear()?
Profe, ¿cual es la diferencia entre “ab” y “ab+”? Saludos
ab abre el fichero para añadirle datos al final, en cambio con ab+ podemos además de añadir datos al final leer datos.
@@diegomoissetdeespanes muchas gracias profe. Buena manera de explicar desde lo más sencillo a lo más complicado con usted uno si aprende.
¿Y como se haría para eliminar un registro?
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no.
Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.)
El algoritmo modificado es:
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
int borrado; // 0=existe 1=borrado
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
producto.borrado=0;
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
}
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void borrar()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a borrar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
producto.borrado=1;
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se borro dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Borrar.
");
printf("7 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
case 6:borrar();
break;
}
} while (opcion!=7);
return 0;
}
@@diegomoissetdeespanes gracias, llevaba tiempo tratando de averiguarlo y me lo facilitaste
Como se hace para eliminar registros?
Lo que se hace es agregar un campo al registro que indique si el registro está borrado o no.
Luego se modifican todos los algoritmos a partir de dicho campo (listados, consultas, modificaciones etc.)
El algoritmo modificado es:
#include
#include
#include
typedef struct {
int codigo;
char descripcion[41];
float precio;
int borrado; // 0=existe 1=borrado
} tproducto;
void continuar()
{
printf("Presione una tecla para continuar
");
getch();
}
void crear()
{
FILE *arch;
arch=fopen("productos.dat","wb");
if (arch==NULL)
exit(1);
fclose(arch);
continuar();
}
void cargar()
{
FILE *arch;
arch=fopen("productos.dat","ab");
if (arch==NULL)
exit(1);
tproducto producto;
printf("Ingrese el codigo del producto:");
scanf("%i",&producto.codigo);
fflush(stdin);
printf("Ingrese el nombre del producto:");
gets(producto.descripcion);
printf("Ingrese precio:");
scanf("%f",&producto.precio);
producto.borrado=0;
fwrite(&producto, sizeof(tproducto), 1, arch);
fclose(arch);
continuar();
}
void listado()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
tproducto producto;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
}
fread(&producto, sizeof(tproducto), 1, arch);
}
fclose(arch);
continuar();
}
void consulta()
{
FILE *arch;
arch=fopen("productos.dat","rb");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a consultar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void modificacion()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a modificar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
printf("%i %s %0.2f
", producto.codigo, producto.descripcion, producto.precio);
printf("Ingrese nuevo precio:");
scanf("%f",&producto.precio);
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se modifico el precio para dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
void borrar()
{
FILE *arch;
arch=fopen("productos.dat","r+b");
if (arch==NULL)
exit(1);
printf("Ingrese el codigo de producto a borrar:");
int cod;
scanf("%i", &cod);
tproducto producto;
int existe=0;
fread(&producto, sizeof(tproducto), 1, arch);
while(!feof(arch))
{
if (cod==producto.codigo && producto.borrado==0)
{
producto.borrado=1;
int pos=ftell(arch)-sizeof(tproducto);
fseek(arch,pos,SEEK_SET);
fwrite(&producto, sizeof(tproducto), 1, arch);
printf("Se borro dicho producto.
");
existe=1;
break;
}
fread(&producto, sizeof(tproducto), 1, arch);
}
if (existe==0)
printf("No existe un producto con dicho codigo
");
fclose(arch);
continuar();
}
int main()
{
int opcion;
do {
printf("1 - Crear un archivo binario llamado \"productos.dat\"
");
printf("2 - Carga de registros de tipo tproducto
");
printf("3 - Listado completo de productos.
");
printf("4 - Consulta de un producto por su codigo.
");
printf("5 - Modificacion del precio de un producto.
");
printf("6 - Borrar.
");
printf("7 - Finalizar
");
printf("Ingrese su opcion:");
scanf("%i",&opcion);
switch (opcion) {
case 1:crear();
break;
case 2:cargar();
break;
case 3:listado();
break;
case 4:consulta();
break;
case 5:modificacion();
break;
case 6:borrar();
break;
}
} while (opcion!=7);
return 0;
}
Cómo sería si en vez que int en borrar sea char
Buenas tardes 🙏