Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SojatDotar en 7 Febrero 2016, 19:17 pm



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

Código:
#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í:

Código
  1. struct alumno {
  2.    char nombre[256];
  3.    char apellido[256];
  4.    int edad;
  5. };

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

Código
  1. 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í,

Código:
#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
Código:
#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

Código:
#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í:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6. using std::exit;
  7.  
  8. struct alumno {
  9.    char nombre[256];
  10.    char apellido[256];
  11.    int edad;
  12. };
  13.  
  14. int main () {
  15. int i;
  16. alumno alum[50];
  17.  
  18. ofstream f;
  19.  
  20. f.open("alumnos.bin", ios::out | ios::binary);
  21. if(f.open) {
  22. for (i=0; i<=50; i++) {
  23. cout<<"Teclee el nombre del alumno"<<endl;
  24. cin>>alum[i].nombre
  25. cout<<"Teclee  el apellido"<<endl;
  26. cin>>alum[i].apellido;
  27. cout<<"Teclee  la edad"<<endl;
  28. cin>>alum[i].edad;
  29. f.write(reinterpret_cast<const char*>(&alum[i]), sizeof(alumno);
  30. }
  31. } else {
  32. cout<<"Error al abrir el archivo"<<endl;
  33. exit(1);
  34. }
  35. is.close();
  36.  
  37.  
  38. //leemos el archivo
  39.  
  40. ifstream fe("alumnos.bin", ios::in | ios::binary);
  41. if (fe){
  42. cerr<<"Se abrio correctamente"<<endl;
  43. } else {
  44. cout<<"No se abrio correctamente"<<endl;
  45. exit(1);
  46. }
  47.  
  48. while (fe && !fe.eof()){
  49. for (i=0; i<=50; i++){
  50. cout<<"Teclee el nombre del alumno"<<endl;
  51. cin>>alum[i].nombre
  52. cout<<"Teclee  el apellido"<<endl;
  53. cin>>alum[i].apellido;
  54. cout<<"Teclee  la edad"<<endl;
  55. cin>>alum[i].edad;
  56.  
  57. fe.read( reinterpret_cast<const char*>(&alum[i]), sizeof(alumno));
  58. }
  59. }//fin del while
  60.  
  61. return 0;
  62. }


Título: Re: Archivos bINARIOS c++
Publicado por: SojatDotar en 9 Febrero 2016, 16:36 pm
Sí así es  :D