Foro de elhacker.net

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
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. using namespace std;
  5. struct prueba{
  6.    int r;
  7. };
  8.  
  9. void escribir(struct prueba t){
  10.    fstream salida("test.b" , ios::out|ios::binary|ios::app|ios::ate);
  11.    salida.write(reinterpret_cast<char *>(&t), sizeof(prueba));
  12.    cout <<"Registro Escrito Exitosamente."<<endl;
  13.    salida.close();
  14.  }
  15.  
  16. int main()
  17. {
  18.  prueba re;
  19.  re.r =1;
  20.  escribir(re);
  21.  re.r =2;
  22.  escribir(re);
  23.  re.r =3;
  24.  escribir(re);
  25.  re.r =4;
  26.  escribir(re);
  27.    re.r =1;
  28.  escribir(re);
  29.    re.r =1;
  30.  escribir(re);
  31.  int l;
  32.  cout <<"\n pulse la tecla de enter"<<endl;
  33.  cin.get();
  34.  fstream entrada("test.b", ios::in|ios::binary);
  35.  entrada.seekg(0,entrada.end);
  36.  l = entrada.tellg();
  37.  int cnd = l/sizeof(prueba);
  38.  entrada.seekg(0,entrada.beg);
  39.  
  40.  cout <<"la longitud del fichero es : "<< cnd;
  41.  cin.get();
  42.  
  43.  vector<prueba> pr;
  44.  prueba obj;
  45.  for(int f= 1; f < cnd; f++)
  46.  {
  47.      entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba));
  48.      pr.push_back(obj);
  49.      entrada.seekg(cnd*f, entrada.cur);
  50.  
  51.  }
  52.  
  53.  
  54.  entrada.close();
  55.  for(int g=0;g< pr.size(); g++)
  56.    cout << "value : "<< pr.at(g).r<<endl;
  57.  
  58.  
  59.  cin.get();
  60.  cin.get();
  61.  return 0;
  62.  
  63. }

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
  1. 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
  1. fstream entrada("test.b", ios::in|ios::binary);
  2.  entrada.seekg(0,entrada.end);
  3.  l = entrada.tellg();
  4.  int cnd = l/sizeof(prueba);
  5.  entrada.seekg(0,entrada.beg);
  6.  
  7.  cout <<"la longitud del fichero es : "<< cnd;
  8.  cin.get();
  9.  
  10.  vector<prueba> pr;
  11.  prueba obj;
  12.  for(int f= 1; f < cnd; f++)
  13.  {
  14.     ////////////////Aqui
  15.      entrada.read(reinterpret_cast<char*>(&obj),sizeof(prueba));
  16.      pr.push_back(obj);
  17.      entrada.seekg(l*f);
  18.  
  19.  }
  20. ///
  21.  
  22.  entrada.close();
  23.  for(int g=0;g< pr.size(); g++)
  24.    cout << "value : "<< pr.at(g).r<<endl;
  25.  


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
  1.  for(int f= sizeof(prueba); f < cnd*(sizeof(prueba)); f += f)
  2.  {
  3.      entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) );
  4.      pr.push_back(obj);
  5.      entrada.seekg(sizeof(prueba),ios::beg);
  6.  
  7.  }


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
  1. for(int i=0; i<cnd; i++)
  2. {
  3.    entrada.seekg(i*sizeof(prueba));
  4.    entrada.read(reinterpret_cast<char*>(&obj), sizeof(prueba) );
  5.    pr.push_back(obj);
  6. }


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().