Archivos bINARIOS c++

Iniciado por SojatDotar, 7 Febrero 2016, 19:17 PM

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

SojatDotar

Buenas tarde quisiera saber como podría hacer llenar un archivo binario desde teclado con un arrays de estructuras

#include <iostream>
#include <fstream>
using namespace std;

struct alumno{

string nombre;
string apellido;
int edad;
};

int main () {


alumno alum[50];

ofstream f;

f.open("alumnos.bin", ios::out | ios::binary);
if(f.open){

for (int i=0; i<=50; i++){

cout<<"Teclee el nombre del alumno"<<endl;
cin>>alum[i].nombre
cout<<"Teclee  el apellido"<<endl;
cin>>alum[i].apellido;
cout<<"Teclee  la edad"<<endl;
cin>>alum[i].edad;
}

}
else {
cout<<"Error al abrir el archivo"<<endl;
}
is.close();


return 0;
}
Así lo implemente pero me da error al compilar

class_OpenGL

Las clases tipo string no guardan la cadena de caracteres en la memoria ocupada por la estructura en sí. Para mayor comodidad, declararía la estructura así:

Código (cpp) [Seleccionar]
struct alumno {
   char nombre[256];
   char apellido[256];
   int edad;
};


Una vez rellenada dicha estructura, es tan simple como copiar byte a byte la memoria de la estructura:

Código (c++) [Seleccionar]
f.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno);

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

SojatDotar

Solo eso, o tengo que hacerlo con cada miembro de la estructura ? esta parte la copio tal cual? (reinterpret_cast<const char*>, otra pregunta si quiero leer el archivo sería tal cual pero cambiando a fread? nunca he usado archivo por eso ando perdido

class_OpenGL

Lo que hace el código es pasarle todos los datos de la estructura al método ofstream::write. Le pasas los datos en forma de array de caracteres (para eso sirve reinterpret_cast). Y si, para cuando leas los datos puedes hacerlo relativamente igual :D Es lo bueno de ese código!

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

SojatDotar

#4
O sea que sería mas o menos así,

#include <iostream>
#include <fstream>
using namespace std;

struct alumno{

string nombre;
string apellido;
int edad;
};

int main () {


alumno alum[50];

ofstream f;

f.open("alumnos.bin", ios::out | ios::binary);
if(f.open){

for (int i=0; i<=50; i++){

cout<<"Teclee el nombre del alumno"<<endl;
cin>>alum[i].nombre
cout<<"Teclee  el apellido"<<endl;
cin>>alum[i].apellido;
cout<<"Teclee  la edad"<<endl;
cin>>alum[i].edad;
f.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno);
}

}
else {
cout<<"Error al abrir el archivo"<<endl;
}
is.close();


return 0;
}
lo pondría despues que hayan introducidos los datos, o antes para que se vaya guardando la información?




Me da un error cuando hago eso, justo en esa linea me dice     f.write(reinterpret_cast<const char*>(&alum), sizeof(alumno);
alumnos.cpp:37:62: error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
alumnos.cpp:37:62: note: (if you use '-fpermissive' G++ will accept your code)

no entiendo porque ese error
#include <iostream>
#include <fstream>
using namespace std;

struct alumno
    {
        string nombre;
        string  apellido;
        int edad;
};


int main () {

alumno alum[50];
ofstream archivosalida("alumno.bin",  ios::out | ios::binary);
if (!archivosalida){
cerr<<"No se pudo abrir correctamente"<<endl;

} //sale del programa si no se abrio correctamente
    for (int i=0; i<50; i++)
    {
                cout << "Teclee el nombre: " << i << endl;
                 cin >> alum[i].nombre;
cout<<"teclee el apellido : "<<i <<endl;
cin>> alum[i].apellido;
cout<<"teclee la edad : "<<i <<endl;
cin>> alum[i].edad;




    }

   archivosalida.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno));
   archivosalida.close();
   
   



return 0;
}

Eternal Idol

El ambito de la variable i es el bucle unicamente.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

SojatDotar

Ya lo he solucionado, ahora me da un problema cuando quiero leer lo que esta en el archivo

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
using std::exit;

struct alumno{

string nombre;
string apellido;
int edad;
};

int main () {

int i;
alumno alum[50];

ofstream f;

f.open("alumnos.bin", ios::out | ios::binary);
if(f.open){

for (i=0; i<=50; i++){

cout<<"Teclee el nombre del alumno"<<endl;
cin>>alum[i].nombre
cout<<"Teclee  el apellido"<<endl;
cin>>alum[i].apellido;
cout<<"Teclee  la edad"<<endl;
cin>>alum[i].edad;
f.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno);
}

}
else {
cout<<"Error al abrir el archivo"<<endl;
exit(1);
}
is.close();


//leemos el archivo

ifstream fe("alumnos.bin", ios::in | ios::binary);
if (fe){
cerr<<"Se abrio correctamente"<<endl;
}
else {
cout<<"No se abrio correctamente"<<endl;
exit(1);
}
while (fe && !fe.eof()){
for (i=0; i<=50; i++){

cout<<"Teclee el nombre del alumno"<<endl;
cin>>alum[i].nombre
cout<<"Teclee  el apellido"<<endl;
cin>>alum[i].apellido;
cout<<"Teclee  la edad"<<endl;
cin>>alum[i].edad;

fe.read( reinterpret_cast< const char* >( &alum[i] ), sizeof(alumno));
}//fin del while


return 0;
}

Eternal Idol

Cita de: SojatDotar en  8 Febrero 2016, 18:11 PM
Ya lo he solucionado, ahora me da un problema cuando quiero leer lo que esta en el archivo

Bien pero no escribas mensajes consecutivos, edita tu mensaje anterior y si vas a estar probando diferentes cosas no escribas hasta que hagas la ultima prueba, no nos vayas dando una actualizacion paso por paso por favor.




Ahora lee lo que te dijo class_OpenGL en su primer mensaje en el hilo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

SojatDotar

Listo problema solucionado!! muchas gracias a todos por su ayuda

MAFUS

Ahora estaría bien que, para el resto de la gente con un problema similar al tuyo, expusieras el código al que has llegado.