Autor
|
Tema: Archivos bINARIOS c++ (Leído 5,348 veces)
|
SojatDotar
Desconectado
Mensajes: 40
|
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
|
|
« Última modificación: 9 Febrero 2016, 18:42 pm por Eternal Idol »
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
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);
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
SojatDotar
Desconectado
Mensajes: 40
|
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
|
|
|
En línea
|
|
|
|
class_OpenGL
Desconectado
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
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 Es lo bueno de ese código!
|
|
|
En línea
|
| Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL |
|
|
|
|
SojatDotar
Desconectado
Mensajes: 40
|
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; }
|
|
« Última modificación: 8 Febrero 2016, 17:16 pm por Eternal Idol »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
El ambito de la variable i es el bucle unicamente.
|
|
|
En línea
|
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
Desconectado
Mensajes: 40
|
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; }
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 40
|
Listo problema solucionado!! muchas gracias a todos por su ayuda
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Archivos Binarios
Programación Visual Basic
|
David Vans
|
5
|
2,281
|
14 Octubre 2006, 19:32 pm
por Nymphetaminito
|
|
|
Archivos binarios en VB6???
Programación Visual Basic
|
Bb-7
|
1
|
3,974
|
10 Abril 2008, 17:26 pm
por krackwar
|
|
|
Archivos Binarios
Programación Visual Basic
|
TheGhost(Z)
|
0
|
1,693
|
21 Agosto 2010, 16:24 pm
por TheGhost(Z)
|
|
|
archivos binarios
Programación C/C++
|
marcico
|
0
|
1,665
|
26 Julio 2012, 14:14 pm
por marcico
|
|
|
[?] Archivos Binarios
Programación C/C++
|
MeCraniDOS
|
3
|
3,040
|
20 Octubre 2013, 15:05 pm
por rir3760
|
|