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
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í:
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:
f.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno);
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
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!
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;
}
El ambito de la variable i es el bucle unicamente.
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;
}
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.
Listo problema solucionado!! muchas gracias a todos por su ayuda
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.
Supongo que es el código suyo que expuso al principio pero cambiándolo con mis consejos. Vamos, que sería así:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
using std::exit;
struct alumno {
char nombre[256];
char apellido[256];
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;
}
Sí así es :D