Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: bash en 8 Abril 2015, 18:44 PM

Título: structura en c++ registro binarios ,Archivos
Publicado por: bash en 8 Abril 2015, 18:44 PM
buenas a todos !!


tengo una dudad estoy haciendo un app que guarda un estructura en un archivo (los datos) bien , la aplicacion toma los datos desde la consola luego los concatena con los que estan en el fichero ahora quiero tambien leer desde la estructura y me resulta medio dificil posteo el codidgo para ver si alguien me puede dar una mano por favor.

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct prueba{
   int r;
};

void escribir(struct prueba t){
   fstream salida("test.b" , ios::out|ios::binary|ios::app|ios::ate);
   salida.write(reinterpret_cast<char *>(&t), sizeof(prueba));
   cout <<"Registro Escrito Exitosamente."<<endl;
   salida.close();
 }

int main()
{
 prueba re;
 re.r =1;
 escribir(re);
 re.r =2;
 escribir(re);
 re.r =3;
 escribir(re);
 re.r =4;
 escribir(re);
   re.r =1;
 escribir(re);
   re.r =1;
 escribir(re);
 int l;
 cout <<"\n pulse la tecla de enter"<<endl;
 cin.get();
 fstream entrada("test.b", ios::in|ios::binary);
 entrada.seekg(0,entrada.end);
 l = entrada.tellg();
 int cnd = l/sizeof(prueba);
 entrada.seekg(0,entrada.beg);

 cout <<"la longitud del fichero es : "<< cnd;
 cin.get();

 vector<prueba> pr;
 prueba obj;
 for(int f= 1; f < cnd; f++)
 {
     entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba));
     pr.push_back(obj);
     entrada.seekg(cnd*f, entrada.cur);

 }


 entrada.close();
 for(int g=0;g< pr.size(); g++)
   cout << "value : "<< pr.at(g).r<<endl;


 cin.get();
 cin.get();
 return 0;

}


me gustaria que alguien explique por lo menos como puedo desplazar seekg() por que lo he intentao varias veces de diferente modos y me da tamanos waoo ...y he buscado por internet pero no he encotrado nada que comprenda.. :'(
Gracias Y disculpen la molestia.
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 8 Abril 2015, 19:27 PM
read() coge los X bytes de la estructura. No tienes que poner seekg() en el for.
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: bash en 8 Abril 2015, 20:20 PM
si eso lo se gracias ahora bien , como te has fijado el archivo el archivo cada vez que el programa se abre crea un registro entonces deseo ir registro por registro y copiarlo en la estructura y luego cargarlo en el vector entonces por eso uso
Código (cpp) [Seleccionar]
seekg() por que me gustaria que se mueva entre los registros y asi poder copiarlo.

se entiende?

Gracias por tomarme en cuenta!!
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 8 Abril 2015, 20:24 PM
Si quieres ir a un byte concreto de archivo, puedes usar simplemente seekg(N), donde n es el byte.
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: bash en 8 Abril 2015, 20:39 PM
esta bien entendi eso pero por que al llegar a este punto el programa se cierra:

Código (cpp) [Seleccionar]
fstream entrada("test.b", ios::in|ios::binary);
  entrada.seekg(0,entrada.end);
  l = entrada.tellg();
  int cnd = l/sizeof(prueba);
  entrada.seekg(0,entrada.beg);

  cout <<"la longitud del fichero es : "<< cnd;
  cin.get();

  vector<prueba> pr;
  prueba obj;
  for(int f= 1; f < cnd; f++)
  {
     ////////////////Aqui
      entrada.read(reinterpret_cast<char*>(&obj),sizeof(prueba));
      pr.push_back(obj);
      entrada.seekg(l*f);

  }
///

  entrada.close();
  for(int g=0;g< pr.size(); g++)
    cout << "value : "<< pr.at(g).r<<endl;
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 8 Abril 2015, 20:46 PM
Exactamente en qué instrucción se cierra?
¿Se cierra con error?
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: bash en 8 Abril 2015, 20:55 PM
cuando trataba de leer!!

lo resolvi aunque no me di cuenta cual era el error


ahora creo que avanze por que me lee dos registros

pero si tengo 24 registro y me cuenta el tamanao y todo pero solo me lee dos

cambie el for un poco!!

Código (cpp) [Seleccionar]
  for(int f= sizeof(prueba); f < cnd*(sizeof(prueba)); f += f)
  {
      entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) );
      pr.push_back(obj);
      entrada.seekg(sizeof(prueba),ios::beg);

  }
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 8 Abril 2015, 20:59 PM
Haces operaciones absurdas fon 'f', y nunca la utilizas.
Simplemente:

Código (cpp) [Seleccionar]
for(int i=0; i<cnd; i++)
{
    entrada.seekg(i*sizeof(prueba));
   entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) );
   pr.push_back(obj);
}
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: bash en 9 Abril 2015, 16:30 PM
es cierto es asi !! me ha corrido parcialmete bien pero por que el archivo me lee dos veces el primer registro ?
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 9 Abril 2015, 16:42 PM
Acabo de corregirlo, poniendo el seekg() al principio del bucle. En cualquier caso, no necesitas el seekg(), prueba prescindiendo de él.
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: bash en 9 Abril 2015, 19:03 PM
no lo he hecho pero como puedo prescindir de este si quiero avanzar entre los diferentes objetos dentro del archivo.?
Título: Re: structura en c++ registro binarios ,Archivos
Publicado por: ivancea96 en 9 Abril 2015, 19:29 PM
Al leer del archivo, el puntero que guarda el streambuff se va moviendo automáticamente, sin que hagas seekg().