04-07-2015, 00:09
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
#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;
}
#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;
}
}