I guys, i have a problem with binary files
A file is opened in the beginning of the main then a case to give the user a choice:
1.- Show the content of the file
2.- Search for a name
3.- Search for a type of crime
4.- Search for a serial number
5.- Close

At first I had every search method open the file and close it, but that on the long run is not as efficient as using the memory buffer. So I tried using the memory buffer with a for loop, but when I try to run the program again the file either is closed or can't be searched again.

Here is an example of a search part

void busqueda_de_Nombre( )
{
    Criminal primerLista;
    //The next lines are for getting the size of the file
    listaEntrada.read( (char*)(& primerLista), sizeof(Criminal));
    listaEntrada.seekg( 0, std::ios::end );
    int tamanio = listaEntrada.tellg();
    listaEntrada.seekg( 0, std::ios::beg );

    // Then with the size of the files I get the number of classes my file has
    Criminal criminales;
    int objetos = tamanio / sizeof(criminales);
    
    std::string buscando_nombre;
    std::cout << "Ingrese Nombre: ";
    getline(std::cin, buscando_nombre);

    int entero_comparador;
    int contador;
    
    int n;
    for ( n = 0; n < objetos; n++  )
    {
        //A string is compared to the contents in the file, if there is a match
        //it gives me the contents of that Class instance
        listaEntrada.read((char*)(& primerLista), sizeof(Criminal));
        if( (entero_comparador = buscando_nombre.compare(primerLista.jalaNombre() ) ) == 0 )
        {
            break;
        }
        else
        {
            contador++;
        }
    }
        listaEntrada.seekg(contador * sizeof(Criminal));
        listaEntrada.read((char*)(& primerLista), sizeof(Criminal));
        if(!entero_comparador)
           {
            imprimirLinea(std::cout, primerLista);
            std::cout << std::endl;
           }
        else
        std::cerr << "El tipo de crimen " << buscando_nombre << " no existe o esta mal escrito." << std::endl;
        
      //In theory, this one returns the pointer to the beginning so I 
      //can search again, but when I try to make a new search NOTHING happens
      listaEntrada.seekg( 0, std::ios::beg );
}

Recommended Answers

All 2 Replies

I guys, i have a problem with binary files
A file is opened in the beginning of the main then a case to give the user a choice:
1.- Show the content of the file
2.- Search for a name
3.- Search for a type of crime
4.- Search for a serial number
5.- Close

At first I had every search method open the file and close it, but that on the long run is not as efficient as using the memory buffer. So I tried using the memory buffer with a for loop, but when I try to run the program again the file either is closed or can't be searched again.

Here is an example of a search part

void busqueda_de_Nombre( )
{
    Criminal primerLista;
    //The next lines are for getting the size of the file
    listaEntrada.read( (char*)(& primerLista), sizeof(Criminal));
    listaEntrada.seekg( 0, std::ios::end );
    int tamanio = listaEntrada.tellg();
    listaEntrada.seekg( 0, std::ios::beg );

    // Then with the size of the files I get the number of classes my file has
    Criminal criminales;
    int objetos = tamanio / sizeof(criminales);
    
    std::string buscando_nombre;
    std::cout << "Ingrese Nombre: ";
    getline(std::cin, buscando_nombre);

    int entero_comparador;
    int contador;
    
    int n;
    for ( n = 0; n < objetos; n++  )
    {
        //A string is compared to the contents in the file, if there is a match
        //it gives me the contents of that Class instance
        listaEntrada.read((char*)(& primerLista), sizeof(Criminal));
        if( (entero_comparador = buscando_nombre.compare(primerLista.jalaNombre() ) ) == 0 )
        {
            break;
        }
        else
        {
            contador++;
        }
    }
        listaEntrada.seekg(contador * sizeof(Criminal));
        listaEntrada.read((char*)(& primerLista), sizeof(Criminal));
        if(!entero_comparador)
           {
            imprimirLinea(std::cout, primerLista);
            std::cout << std::endl;
           }
        else
        std::cerr << "El tipo de crimen " << buscando_nombre << " no existe o esta mal escrito." << std::endl;
        
      //In theory, this one returns the pointer to the beginning so I 
      //can search again, but when I try to make a new search NOTHING happens
      listaEntrada.seekg( 0, std::ios::beg );
}

Hello, before you return the pointer to the beginning clear your stream:

listaEntrada.clear();
commented: You resolved my problem totally, I didn't know that I had to clear the stream, I thank you deeply +0

Thanks vanalex, this fixed my problem, now my code runs better, and I don't have to open the binary file multiple times in my program, it is more efficient.

Thanks again.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.