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

[SOLUCIONADO] Problema con Busqueda en archivo binario

Estas en el tema de Problema con Busqueda en archivo binario en el foro de C/C++ en Foros del Web. No me sale por pantalla lo que estoy buscando en el archivo binario Denme una mano!! void Clientes(){ system("cls"); FILE *pf; struct Cliente cli; int ...
  #1 (permalink)  
Antiguo 19/03/2013, 18:57
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Problema con Busqueda en archivo binario

No me sale por pantalla lo que estoy buscando en el archivo binario
Denme una mano!!

void Clientes(){
system("cls");
FILE *pf;
struct Cliente cli;
int tam_cli= sizeof(cli);

int elegi,op=0;
while(op==0){
system("cls");
printf("1>__Ingresar nuevo cliente\n");
printf("2>__Buscar Cliente\n");
printf("3>__Salir\n");
scanf("%d",&elegi);

switch(elegi)
{
case 1:
pf= fopen("Clientes.dat","ab");
if(pf==NULL)
{
perror("error al abrir el archivo");
return;
}
system("cls");
do
{
printf("Nombre: ");
scanf("%s",&cli.nombre);
printf("Apellido: ");
scanf("%s",&cli.apellido);
printf("Direccion: ");
scanf("%s",&cli.direccion);
printf("Cumpleaños: ");
scanf("%s",&cli.fechacumple);
printf("Fecha de compra: ");
scanf("%s",&cli.fechacompra);
printf("Ingrese Articulo vendido\n");
scanf("%s",&cli.com.articulo);
printf("Ingrese el talle\n");
scanf("%s",&cli.com.talle);
fwrite(&cli,tam_cli,1,pf);
fflush(stdin);
printf("Desea seguir ingresando Clientes presione 0 sino 1\n");
scanf("%d",&op);
}
while(op==0);
fclose(pf);
break;
case 2:
pf= fopen("Clientes.dat","ab");
if(pf==NULL)
{
perror("error al abrir el archivo");
return;
}
int n;
system("cls");
char ap[15];
printf("Ingrese Apellido: ");
scanf("%s",&ap);
while((n=fread(&cli,tam_cli,1,pf))!=0&&stricmp(cli .apellido,ap)!=0);
{
if(n==0)
{
printf("No existe el cliente \n");
system("PAUSE");
}
else
{
printf("Nombre: %s\tApellido: %s\nDireccion: %s\nCompra: %s\nCumpleaños: %s\n",cli.nombre,cli.apellido,cli.direccion,cli.fe chacompra,cli.fechacumple);
system("PAUSE");
}
}
fclose(pf);
break;
case 3:
return;
default:
printf("Error ingrese un numero del 1 al 3\n");
}
}
}
  #2 (permalink)  
Antiguo 20/03/2013, 13:12
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema con Busqueda en archivo binario

HOla! en el case 2 abri el archivo para lectura "r", no para añadir "a"


SAludos

PD: utiliza la Highlight para poner codigo
  #3 (permalink)  
Antiguo 20/03/2013, 13:13
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problema con Busqueda en archivo binario

Antes de nada indenta el codigo por favor, que no se entiende nada.

Cuando hayas indentado, ve al caso 2, en la funcion fopen y comprueba los flags de modo de acceso al archivo: estas intentando leer con un puntero al archivo abierto en modo añadir binario. Echa un vistazo a tu manual de la funcion fopen para ver mas modos de acceso, concretamente el modificador '+'.

Saludos
vosk
  #4 (permalink)  
Antiguo 20/03/2013, 13:14
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problema con Busqueda en archivo binario

Perdona cesar_casla, no vi tu post antes de colgar el mio

Saludos
vosk
  #5 (permalink)  
Antiguo 20/03/2013, 18:08
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con Busqueda en archivo binario

Ya lo cambie, pero solo me deja leer la primer estructura guardada, las demas no me las encuentra

Última edición por mati_fur; 20/03/2013 a las 18:20 Razón: borrar
  #6 (permalink)  
Antiguo 20/03/2013, 18:21
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con Busqueda en archivo binario

Gracias, pero ya lo cambie y solo me lee la primer estructura guardada, las demas no las encuentra
  #7 (permalink)  
Antiguo 21/03/2013, 13:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problema con Busqueda en archivo binario

Eso es que hay algo mal en el condicional de la comparacion que usas en la busqueda; comprueba lo siguiente

Código:
int n;
char ap[15];
bool noexiste = 1;

printf("Ingrese Apellido: ");
scanf("%s", &ap);

while((n = fread(&cli, tam_cli, 1, pf))) {
	if(!(noexiste = stricmp(cli.apellido, ap))) {
		printf("Nombre: %s\tApellido: %s\n",cli.nombre, cli.apellido);
		break;
	}
}
if(noexiste) {
	printf("No existe el cliente\n");
}
fclose(pf);
En este caso solo encuentra la primera coincidencia de apellido, es decir que si hay varios apellidos iguales se los salta; si quieres que los muestre todos los que coinciden debes quitar el break.

Otra cosa, puede que este codigo te de problemas al insertarlo en el tuyo a causa del break que uso para salir del while; si no lo necesitas lo quitas y arreglado; si lo necesitas y te da error en la compilacion tendras que en cerrar todo el 'case' en {}

Aun otra cosa, no uses fflush con stdin; en este mismo foro ha salida ya varias veces formas de vaciar el stdin, no tendras problema para encontrar la forma correcta de hacerlo.

Y por favor indenta el codigo, será mejor para ti y para los que puedan ayudarte cuando tengas mas problemas y quieras preguntar en algun foro.

Saludos
vosk
  #8 (permalink)  
Antiguo 21/03/2013, 17:19
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con Busqueda en archivo binario

gracias,pero todavía me hace lo mismo,solo me deja ver la primer estructura
las otras no me las encuentra
  #9 (permalink)  
Antiguo 21/03/2013, 17:34
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema con Busqueda en archivo binario

Cuando decis q "solo me deja ver la primer estructura" te referis a que por ejemplo si tenes 3 nombres guardados, "pedro" "juan" y "carlos", solo podes leer "pedro" y el resto no???


Saludos

PD: si hicist algun cambio en el codigo volve a subirlo
  #10 (permalink)  
Antiguo 21/03/2013, 18:01
 
Fecha de Ingreso: marzo-2013
Mensajes: 6
Antigüedad: 11 años, 7 meses
Puntos: 0
Respuesta: Problema con Busqueda en archivo binario

Mira yo tengo guardado un archivo y si pongo q me busque algún apellido no me lo encuentra, el único que me encuentra y me lo imprime es la primer estructura q tengo guardada en las demás me dice q no existen
  #11 (permalink)  
Antiguo 21/03/2013, 18:20
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema con Busqueda en archivo binario

Que raro, hice un programa de prueba y me anda bien:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct Cliente {
  6.     char nombre[20];
  7.     char apellido[20];
  8. };
  9.  
  10. void Clientes(void);
  11.  
  12. int main(){
  13.    
  14.         Clientes();
  15.        
  16.         return 0;
  17.  
  18. }
  19.  
  20. void Clientes(){
  21.     system("cls");
  22.     FILE *pf;
  23.     struct Cliente cli;
  24.     int tam_cli= sizeof(cli);
  25.  
  26. int elegi,op=0;
  27. while(op==0){
  28. system("cls");
  29. printf("1>__Ingresar nuevo cliente\n");
  30. printf("2>__Buscar Cliente\n");
  31. printf("3>__Salir\n");
  32. scanf("%d",&elegi);
  33.  
  34. switch(elegi)
  35. {
  36. case 1:
  37. pf= fopen("Clientes.dat","ab");
  38. if(pf==NULL)
  39. {
  40. perror("error al abrir el archivo");
  41. return;
  42. }
  43. system("cls");
  44. do
  45. {
  46. printf("Nombre: ");
  47. scanf("%s",&cli.nombre);
  48. printf("Apellido: ");
  49. scanf("%s",&cli.apellido);
  50. //printf("Direccion: ");
  51. /*scanf("%s",&cli.direccion);
  52. printf("Cumpleaños: ");
  53. scanf("%s",&cli.fechacumple);
  54. printf("Fecha de compra: ");
  55. scanf("%s",&cli.fechacompra);
  56. printf("Ingrese Articulo vendido\n");
  57. scanf("%s",&cli.com.articulo);
  58. printf("Ingrese el talle\n");
  59. scanf("%s",&cli.com.talle);*/
  60. fwrite(&cli,tam_cli,1,pf);
  61. fflush(stdin);
  62. printf("Desea seguir ingresando Clientes presione 0 sino 1\n");
  63. scanf("%d",&op);
  64. }
  65. while(op==0);
  66. fclose(pf);
  67. break;
  68. case 2:
  69. pf= fopen("Clientes.dat","rb");
  70. if(pf==NULL)
  71. {
  72. perror("error al abrir el archivo");
  73. return;
  74. }
  75. int n;
  76. system("cls");
  77. char ap[15];
  78. printf("Ingrese Apellido: ");
  79. scanf("%s",&ap);
  80. while((n=fread(&cli,tam_cli,1,pf))!=0&&stricmp(cli .apellido,ap)!=0);
  81. if(n==0)
  82. {
  83. printf("No existe el cliente \n");
  84. system("PAUSE");
  85. }
  86. else
  87. {
  88. printf("Nombre: %s\tApellido: %s\n",cli.nombre,cli.apellido);
  89. system("PAUSE");
  90. }
  91.  
  92. fclose(pf);
  93. break;
  94. case 3:
  95. return;
  96. default:
  97. printf("Error ingrese un numero del 1 al 3\n");
  98. }
  99. }
  100. }
  #12 (permalink)  
Antiguo 21/03/2013, 18:23
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 12 años, 5 meses
Puntos: 127
Respuesta: Problema con Busqueda en archivo binario

No existen los archivos binarios. Existe la apertura binaria que dista de la normal por representar cada byte en lugar de como un carácter ascii, como un ente numérico hexadecimal, decimal u octal.

Un repaso a las bases vendría bien.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #13 (permalink)  
Antiguo 22/03/2013, 12:28
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problema con Busqueda en archivo binario

"...Mira yo tengo guardado un archivo..."

Eso significa que ese archivo lo has creado con la funcion que tienes para guardar clientes? Si es asi tendria que funcionar, si no es asi genera desde 0 un nuevo archivo y prueba de nuevo. De todas formas puedes hacer la prueba de mostrarlos todos: si solo te muestra uno es que o solo hay uno o hay algo mas que no aparece en el codigo que colgaste. Cuelga tambien la estructura Cliente no sea que haya algo por ahi.

Saludos
vosk

Etiquetas: binario, busqueda, int, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:50.