UTNianos

Versión completa: Ayuda. Busqueda Binaria de Archivos C++
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola que tal, alguien podría ser tan amable de pasarme un ejemplo de código en c++ de búsqueda binaria de archivos por favor, estuve intentando hacerlo funcionar pero no lo encuentro la vuelta y lo necesito pronto. Gracias
hola
podes mostrarme el codigo?
asi lo modificamos.
Lo que me interesa es que la función búsqueda binaria me funcione mas allá de otro errores que hay.. Gracias


#include <cstdlib>
#include <iostream>

struct Trprods{
int codp;
float pu;
};
Trprods Rprods;
struct Trvtas {
int cod;
float tot;
};


using namespace std;

void seek(FILE* arch, int recSize, int n) {

fseek(arch, n*recSize,SEEK_SET);

}

long fileSize(FILE* f, int recSize) {

long curr=ftell(f);

fseek(f,0,SEEK_END);

long ultimo=ftell(f);

fseek(f,curr,SEEK_SET);

return ultimo/recSize;

}

long filePos(FILE* arch, int recSize) {

return ftell(arch)/recSize;

}

int BusquedaBinariaArchivo(FILE*f, Trprods ,int Posic){
int U,M;
int codp;
Posic = -1;
int Pri=0;

U = fileSize(f,sizeof(Rprods));
while ((Pri <= U) and (Posic = -1)) {

M = (Pri + U )/2;

fseek(f, M*sizeof(f),SEEK_SET);
fread(&f,sizeof(Rprods),1,f) ;

if ( Rprods.codp = codp)
{

Posic = M;

}
else
{

if( codp > Rprods.codp)
{


Pri = M+1;

}
else
{

U = M - 1;
}
}
}

}


int main(int argc, char *argv[])
{
int codp;
int cantu;
int Posic;
{
FILE*Prods;
Trprods Rprod;
Prods = fopen ("Prods.dat","rb");

FILE*Vtas;
Trvtas Rvtas;
Vtas = fopen ("Vtas.dat","wb");

for(int i =1; fileSize(Prods,sizeof(Rprod));i++)
{
fread(&Rprod, sizeof(Rprod), 1, Prods);
Rvtas.cod = Rprod.codp;
Rvtas.tot = 0;
fwrite(&Rvtas,sizeof(Rvtas),1,Vtas);
}

cout<<"ingrese el cod de producto: "<<endl;
cout<<"ingrese 0 para terminar el ingreso. "<<endl;
cin>>codp;
float imp;

while(codp != 0);
{
cin>>cantu;
BusquedaBinariaArchivo(Prods ,Trprods? ,posic?)
fseek(Prods,Posic,SEEK_SET);
fread(&Rprod, sizeof(Rprod), 1, Prods);
imp = Rprod.pu*cantu;

cout<<Rvta.codp<<endl;
cout<<cantu<<endl;
cout<<imp<<endl;
seek(Vtas,pos,SEEK_SET);
fread(&Rvtas,sizeof(Rvtas),1,Vtas)
Rvtas.tot = Rvtas.tot+ imp;
seek (Vtas,Posic,SEEK_SET);
fwrite(&Rvtas,sizeof(Rvtas),1,Vtas);

cin>>codp;
}

seek(Vtas,0);

while ( !feof(Vtas) );
{
fread(&Rvtas,sizeof(Rvtas),1,Vtas);
if ( Rvtas.tot=0 )
{
cout<<Rvtas.cod<<endl;
cout<<"no se vendio"<<endl;
}

cout<<Rvtas.cod<<endl;
cout<<Rvtas.tot<<endl;
}
fclose(Prods);
fclose(Vtas);


system("PAUSE");
return EXIT_SUCCESS;
}

me gustaria saber de que trata el problema , podes decirme??
Dice dado un archivo de prod ordenado por cod de prod, con el siguiente diseño:
codigo de prod.(int) precio unitario(float)
y un conjunto de pedidos, donde cad uno se conoce cod de prod y cant de unidades pedidas(word).Los pedidos finalizan con un cod = a 0, y hay stock suf para satisfacer todos los pedidos(todos se transforman en vtas)
informar de cada vta codigo de prod, unidades e importe de la venta
informar los cod de prod que no fueron vendidos
grabar un archivo binario con los sig datos:
Cod de prod Total facturado
999 9999999
Ahí lo modifique un poco pero sigo con problemas para correrlo cry

#include <cstdlib>
#include <iostream>

struct Trprods{
int codp;
float pu;
};
Trprods Rprods;
struct Trvtas {
int cod;
float tot;
};


using namespace std;

long fileSize(FILE* f, int recSize) {

long curr=ftell(f);

fseek(f,0,SEEK_END);

long ultimo=ftell(f);

fseek(f,curr,SEEK_SET);

return ultimo/recSize;

}

long filePos(FILE* arch, int recSize) {

return ftell(arch)/recSize;

}

int BusquedaBinariaArchivo(FILE*f, Trprods ,int Posic){
int U,M;
int codp;
Posic = -1;
int Pri=0;

U = fileSize(f,sizeof(Rprods));
while ((Pri <= U) and (Posic = -1)) {

M = (Pri + U )/2;

fseek(f, M*sizeof(Rprods),SEEK_SET);
fread(&f,sizeof(Rprods),1,f) ;

if ( Rprods.codp = codp)
{

Posic = M;

}
else
{

if( codp > Rprods.codp)
{


Pri = M+1;

}
else
{

U = M - 1;
}
}
}

}


int main(int argc, char *argv[])
{
int codp;
int cantu;
int Posic;
{
FILE*Prods;
Trprods Rprods;
Prods = fopen ("Productos.dat","rb");

FILE*Vtas;
Trvtas Rvtas;
Vtas = fopen ("Vtas.dat","wb");

for(int i =1; fileSize(Prods,sizeof(Rprods));i++)
{
fread(&Rprods, sizeof(Rprods), 1, Prods);
Rvtas.cod = Rprods.codp;
Rvtas.tot = 0;
fwrite(&Rvtas,sizeof(Rvtas),1,Vtas);
}

cout<<"ingrese el cod de producto: "<<endl;
cout<<"ingrese 0 para terminar el ingreso. "<<endl;
cin>>codp;
float imp;

while(codp != 0)
{
cin>>cantu;
BusquedaBinariaArchivo(Prods ,Rprods ,Posic);
fseek(Prods,Posic,SEEK_SET);
fread(&Rprods, sizeof(Rprods), 1, Prods);
imp = Rprods.pu*cantu;

cout<<Rvtas.cod<<endl;
cout<<cantu<<endl;
cout<<imp<<endl;
fseek(Vtas,Posic,SEEK_SET);
fread(&Rvtas,sizeof(Rvtas),1,Vtas);
Rvtas.tot = Rvtas.tot+ imp;
fseek (Vtas,Posic,SEEK_SET);
fwrite(&Rvtas,sizeof(Rvtas),1,Vtas);

cin>>codp;
}

fseek(Vtas,0,SEEK_SET);

while ( !feof(Vtas) )
{
fread(&Rvtas,sizeof(Rvtas),1,Vtas);
if ( Rvtas.tot=0 )
{
cout<<Rvtas.cod<<endl;
cout<<"no se vendio"<<endl;
}

cout<<Rvtas.cod<<endl;
cout<<Rvtas.tot<<endl;
}
fclose(Prods);
fclose(Vtas);

system("PAUSE");
return EXIT_SUCCESS;
}
}



URLs de referencia