Ayuda - Archivo binario

Iniciado por Cero++, 25 Enero 2019, 13:04 PM

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

Cero++

Buenas, hice un ejercicio donde tenía que cargar en un archivo binario pares de datos donde uno era float y el otro int.
El problema es, que cuando hice otro programa para cargar un vector con esos datos guardados en ese archivo, no me muestra nada.
Aquí les dejo el código, sinceramente, no veo dónde está el problema, porque ni siquiera en la compilación me da error.

Código (cpp) [Seleccionar]
Pares{ float a, int b}

main(){
Pares aux; vector<Pares> P;
ifstream entrada;
entrada.open(/*nom_archi*/,ios::binary|ios::ate);
if(!entrada.is_open(){
/*algo...*/
}
int tam_archi=entrada.tellg()/sizeof(Pares);
entrada.seekg(0);
for(int i=0;i=tam_archi;i++){
entrada.read(reinterpret_cast <char*> (&aux),sizeof(aux));
P.push_back(aux);
}
entrada.close();
fori(P.size()){
cout<<P[i].a<<" "<<P[i].b<<endl; /*No muestra nada*/
}

Esto es un ejemplo del programa que hice, para que no sea tan largo de leer, al finalizar la compilación no me saltan errores, pero no muestra el vector, como si no tuviese nada, la lectura debería ir bien y cada vez que leo un "Par" debería ponerlo en el vector, pero no es el caso.
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

Loretz

Hay un problema desde la primera línea:
Pares{ float a, int b}
Pares no tiene definido el tipo.
{float a, int n} no es una expresión C++ válida. Fíjate que están separados por una coma y que int n no termina en ;
También falta el ; al final de la expresión.

Después hay otras cosas, pero deberías tratar primero de que compile.

CalgaryCorpus

Será que en la línea 12 asignas 2 veces la variable i?
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Cero++

Cita de: Loretz en 25 Enero 2019, 13:38 PM
Hay un problema desde la primera línea:
Pares{ float a, int b}
Pares no tiene definido el tipo.
{float a, int n} no es una expresión C++ válida. Fíjate que están separados por una coma y que int n no termina en ;
También falta el ; al final de la expresión.

Después hay otras cosas, pero deberías tratar primero de que compile.

Es un ejemplo, ya se que falta el tipo de dato (struct) y los otros errores de sintaxis ; puse un "prototipo" de lo que hice, para que me dijeran qué podría estar mal a nivel lógico jaja espero me comprendas, sino, pongo el código exacto de lo que hice.
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

Cero++

Cita de: CalgaryCorpus en 25 Enero 2019, 21:58 PM
Será que en la línea 12 asignas 2 veces la variable i?
Cómo que la asigno dos veces? en la primera entrada de la estructura iterativa lo declaro y ya más luego pongo desde dónde leer y hasta dónde hacerlo.
Me fije en el programa base que había hecho, tenía un pequeño problema, lo modifique y probé nuevamente (anduvo) pero al hacer éste prototipo, para ver si realmente se guardaron los datos en el archivo, cuando itero el vector de pares, éste se encuentra vacío jaja me ha dejado en las nubes, releí la teoría, pero no he hecho nada incorrecto, a mi parecer jaja
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

K-YreX

Lo que CalgaryCorpus quiere decir con que asignas dos veces la variable <i> es lo siguiente:
Código (cpp) [Seleccionar]

for(int i = 0; i = tam_archi; i++){}

Ahí estás inicializando la variable <i> a 0, seguidamente le asignas el valor <tam_archi> y ya se ejecuta el <for>. El segundo campo del <for> es incorrecto.


Cita de: Cero++ en 25 Enero 2019, 22:34 PM
Es un ejemplo, ya se que falta el tipo de dato (struct) y los otros errores de sintaxis ; puse un "prototipo" de lo que hice, para que me dijeran qué podría estar mal a nivel lógico jaja espero me comprendas, sino, pongo el código exacto de lo que hice.
Te recomiendo para este tipo de errores que copies el código original, ya que el error puede deberse a que haya algo mal implementado y que tú estés pasando por alto. Si es muy largo puedes copiar sólo el bloque más relevante. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

EdePC

Saludos,

- Y se puede leer así de esa forma tan indiscriminada un fichero binario :xD?, te muestro el siguiente ejemplos sencillo que escribe y lee un Float y un Int  a/desde un fichero binario:

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
  float ofloat = 5.6;
  int   oint   = 10;
  ofstream ofile( "file.bin", ios::out | ios::binary );
  ofile.write( (char *) &ofloat, sizeof(float) );
  ofile.write( (char *) &oint, sizeof(int) );
  ofile.close();

 
  float ifloat = 0;
  int   iint   = 0;
  ifstream ifile( "file.bin", ios::in );
  ifile.read( (char *) &ifloat, sizeof(float) );
  ifile.read( (char *) &iint, sizeof(int) );
  cout << ifloat << endl;
  cout << iint << endl;
  ifile.close();
  return 0;
}

Cero++

Cita de: YreX-DwX en 26 Enero 2019, 00:35 AM
Lo que CalgaryCorpus quiere decir con que asignas dos veces la variable <i> es lo siguiente:
Código (cpp) [Seleccionar]

for(int i = 0; i = tam_archi; i++){}

Ahí estás inicializando la variable <i> a 0, seguidamente le asignas el valor <tam_archi> y ya se ejecuta el <for>. El segundo campo del <for> es incorrecto.

Te recomiendo para este tipo de errores que copies el código original, ya que el error puede deberse a que haya algo mal implementado y que tú estés pasando por alto. Si es muy largo puedes copiar sólo el bloque más relevante. :-X

Jaja que error "boludo" no lo veía! Gracias por remarcarlo  ;D
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]

Cero++

Cita de: EdePC en 26 Enero 2019, 01:55 AM
Saludos,

- Y se puede leer así de esa forma tan indiscriminada un fichero binario :xD?, te muestro el siguiente ejemplos sencillo que escribe y lee un Float y un Int  a/desde un fichero binario:

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
  float ofloat = 5.6;
  int   oint   = 10;
  ofstream ofile( "file.bin", ios::out | ios::binary );
  ofile.write( (char *) &ofloat, sizeof(float) );
  ofile.write( (char *) &oint, sizeof(int) );
  ofile.close();

 
  float ifloat = 0;
  int   iint   = 0;
  ifstream ifile( "file.bin", ios::in );
  ifile.read( (char *) &ifloat, sizeof(float) );
  ifile.read( (char *) &iint, sizeof(int) );
  cout << ifloat << endl;
  cout << iint << endl;
  ifile.close();
  return 0;
}

Mi nivel no es tan alto como para escribir un fichero como lo haces vos! jaja La próxima copio el código del compilador!
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]