Título: Archivos bINARIOS c++
Publicado por: SojatDotar en 7 Febrero 2016, 19:17 pm
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
Título: Re: Archivos bINARIOS c++
Publicado por: class_OpenGL en 8 Febrero 2016, 00:21 am
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);
Título: Re: Archivos bINARIOS c++
Publicado por: SojatDotar en 8 Febrero 2016, 02:39 am
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
Título: Re: Archivos bINARIOS c++
Publicado por: class_OpenGL en 8 Febrero 2016, 15:28 pm
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!
Título: Re: Archivos bINARIOS c++
Publicado por: SojatDotar en 8 Febrero 2016, 15:37 pm
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; }
Título: Re: Archivos bINARIOS c++
Publicado por: Eternal Idol en 8 Febrero 2016, 17:16 pm
El ambito de la variable i es el bucle unicamente.
Título: Re: Archivos bINARIOS c++
Publicado por: 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 #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; }
Título: Re: Archivos bINARIOS c++
Publicado por: Eternal Idol en 8 Febrero 2016, 18:14 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.
Título: Re: Archivos bINARIOS c++
Publicado por: SojatDotar en 8 Febrero 2016, 18:19 pm
Listo problema solucionado!! muchas gracias a todos por su ayuda
Título: Re: Archivos bINARIOS c++
Publicado por: MAFUS en 8 Febrero 2016, 21:28 pm
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.
Título: Re: Archivos bINARIOS c++
Publicado por: class_OpenGL en 9 Febrero 2016, 06:28 am
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; }
Título: Re: Archivos bINARIOS c++
Publicado por: SojatDotar en 9 Febrero 2016, 16:36 pm
Sí así es :D
|