structura en c++ registro binarios ,Archivos

Iniciado por bash, 8 Abril 2015, 18:44 PM

0 Miembros y 1 Visitante están viendo este tema.

bash

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.
gracias por responder mis dudas

ivancea96

read() coge los X bytes de la estructura. No tienes que poner seekg() en el for.

bash

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!!
gracias por responder mis dudas

ivancea96

Si quieres ir a un byte concreto de archivo, puedes usar simplemente seekg(N), donde n es el byte.

bash

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;
gracias por responder mis dudas

ivancea96

Exactamente en qué instrucción se cierra?
¿Se cierra con error?

bash

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);

  }
gracias por responder mis dudas

ivancea96

#7
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);
}

bash

es cierto es asi !! me ha corrido parcialmete bien pero por que el archivo me lee dos veces el primer registro ?
gracias por responder mis dudas

ivancea96

Acabo de corregirlo, poniendo el seekg() al principio del bucle. En cualquier caso, no necesitas el seekg(), prueba prescindiendo de él.