Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marlboreano en 15 Marzo 2015, 15:36 pm



Título: [C++] [?] SIGSEGV
Publicado por: marlboreano en 15 Marzo 2015, 15:36 pm
Hola a todos.

Tengo un pequeño gran problema con archivos y todo el estandar :B. Lo que quería hacer (por hacer, nada de facultad ni por el estilo) era guardar en un fichero unos 3 strings, y luego cargarlos dentro de un programa con ventanas. Hasta ahí, todo bien, el tema me surge cuando cargo los strings (me los devuelve con basura). Les dejo el código para que me remarquen el error, ya que sé que será de novato, pero no lo encuentro.

Código
  1. #include "frmVentana.h"
  2. #include <wx/msgdlg.h>
  3. #include <fstream>
  4. #include <sstream>
  5. #include <string>
  6. using namespace std;
  7.  
  8. frmVentana::frmVentana(wxWindow *parent) : Frame1(parent) {
  9. aux = "";
  10. Show();
  11. ofstream salida("datos.dat",ios::binary|ios::trunc);
  12. if (!salida.is_open()) {
  13. wxMessageBox("No se pudo guardar");
  14. }
  15. aux = "Nombre";
  16. salida.write(reinterpret_cast<char*>(&aux),sizeof(string));
  17. aux = "00";
  18. salida.write(reinterpret_cast<char*>(&aux),sizeof(string));
  19. aux = "C:\\una_imagen.png";
  20. salida.write(reinterpret_cast<char*>(&aux),sizeof(string));
  21. salida.close();
  22. }
  23.  
  24. frmVentana::~frmVentana() {
  25.  
  26. }
  27.  
  28. void frmVentana::CargarNomClick( wxCommandEvent& event )  {
  29. ifstream archivo("datos.dat",ios::binary|ios::ate);
  30. if (!archivo.is_open()) {
  31. wxMessageBox("No se pudo cargar");
  32. }
  33. archivo.seekg(0*sizeof(string));
  34. aux.clear();
  35. archivo.read(reinterpret_cast<char*>(&aux),sizeof(string));
  36. archivo.close();
  37. lblNombre->SetLabel(aux);
  38. }
  39.  
  40. void frmVentana::CargarValorClick( wxCommandEvent& event )  {
  41. ifstream archivo("datos.dat",ios::binary|ios::ate);
  42. if (!archivo.is_open()) {
  43. wxMessageBox("No se pudo cargar");
  44. }
  45. archivo.seekg(1*sizeof(string));
  46. aux.clear();
  47. archivo.read(reinterpret_cast<char*>(&aux),sizeof(string));
  48. archivo.close();
  49. lblValorGral->SetLabel(aux);
  50. }
  51.  
  52. void frmVentana::CargarImgClick( wxCommandEvent& event )  {
  53. ifstream archivo("datos.dat",ios::binary|ios::ate);
  54. if (!archivo.is_open()) {
  55. wxMessageBox("No se pudo cargar");
  56. }
  57. archivo.seekg(2*sizeof(string));
  58. aux.clear();
  59. archivo.read(reinterpret_cast<char*>(&aux),sizeof(string));
  60. archivo.close();
  61. wxBitmap a;
  62. a.LoadFile(aux,wxBITMAP_TYPE_PNG);
  63. imgPais->SetSize(a.GetWidth(),a.GetHeight());
  64. imgPais->SetBitmap(a);
  65. }
  66.  
  67. void frmVentana::CargarIcoClick( wxCommandEvent& event )  {
  68. ifstream archivo("datos.dat",ios::binary|ios::ate);
  69. if (!archivo.is_open()) {
  70. wxMessageBox("No se pudo cargar");
  71. }
  72. archivo.seekg(2*sizeof(string));
  73. aux.clear();
  74. archivo.read(reinterpret_cast<char*>(&aux),sizeof(string));
  75. archivo.close();
  76. wxBitmap a;
  77. a.LoadFile(aux,wxBITMAP_TYPE_PNG);
  78. icoPais->SetSize(a.GetWidth(),a.GetHeight());
  79. icoPais->SetBitmap(a);
  80. }

P.D.: Integro wxFormBuilder (wxWidget) al código para crear mis ventanas, botones, labels, etc.
P.D.2: Utilizo un string "aux" que está declarado como privado en la clase "frmVentana".
P.D.3: Suelo utilizar nombres bien 'boludos' para las clases heredadas, por lo tanto confío en que sabrán que un "lblNombre" es una etiqueta en donde se mostrará un string "nombre".

Desde ya, muchas gracias :).


Título: Re: [C++] [?] SIGSEGV
Publicado por: ivancea96 en 15 Marzo 2015, 20:56 pm
No puedes hacer un casting de string a char*. Usa en su lugar aux.c_str().
No pongas sizeof(string). Pon aux.size().