Comunidad de diseño web y desarrollo en internet online

streams (archivos / ficheros) en C++

Citar            
MensajeEscrito el 30 Nov 2005 06:08 pm
Recordando mis viejos tiempos, y a petición de una amiga (clásico ¬¬ *sigh* ) estoy elaborando un pequeño programita, pero me pasa algo curioso... les comento...

Grabó todo en un archivo binario y tal que se queda todo (al menos eso parece, pero al recorrer el archivo para la lectura, he notado que en el caso de la variable nombre, sólo se guarda el último nombre que capture... lo chistoso es que las otras dos variable si se guardan como debe ser...

Está es mi clase:

Código :

class Persona
{
      private:
              int id;
              char *nombre;
              int edad;
.........
........
//Obvio que aquí van los métodos y demás....
}


Ahora aca grabo todo en el archivo

Código :

escritura.open("personas.dat", ios::out |ios::binary);
    for (num = 0; num<5; num++)
    {
        cout<<"Nombre:";
        cin>>nombre;
        cout<<"Edad:";
        cin>>edad;
        id++;
        persona.setNombre(nombre);
        persona.setEdad(edad);
        persona.setID(id);
        escritura.write(reinterpret_cast<char *>(&persona), sizeof(Persona));
        persona.setNombre(NULL);
    }
    escritura.close();


Escritura es un stream del tipo ofstream. Y así leo después lo que grabé

Código :

lectura.open("personas.dat", ios::in | ios::binary);
    lectura.seekg(0, ios::beg);
    for(num = 0; num<5; num++)
    {
            lectura.read(reinterpret_cast<char *>(&persona), sizeof(Persona));
            cout<<"ID :"<<persona.getID()<<endl;
            cout<<"Nombre :"<<persona.getNombre()<<endl;
            cout<<"Edad :"<<persona.getEdad()<<endl;
            cout<<endl;
    }
    lectura.close();


Lectura es un stream de tipo ifstream ... Y esto es lo que me pasa



Alguna sugerencia??? seguro me falta algo... pero no estoy seguro de que es...

Se me olvidaba este es el método setNombre

Código :

void setNombre(char *n)
             {
                  nombre = n;
             }


Recordarles que como uso punteros y estoy en C++ eso es más que válido, por lo que no necesito del strcpy, es más mi compilador (Mingw) se crashea si uso strcpy en esas condiciones (por obvias razones)

Por Aoyama

BOFH

6224 de clabLevel

6 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Bastard Operators From Hell

Webdesigner & Developer, en mis ratos libres bebo café por litros.

firefox
Citar            
MensajeEscrito el 30 Nov 2005 06:20 pm
De C++ he visto poco, asi que me da miedo decir una barbaridad pero bueno...

He visto que Nombre lo declaras como puntero (*Nombre), prueba a quitarle el asterisco.

Si mal no recuerdo los punteros reservan una posición de memoria por lo cual te sobreescribiria cada vez el nombre, y como el ultimo que pones es Rosalia, pues Rosalia se queda.

PD: Ya te digo que no estoy muy seguro de lo que estoy diciendo :crap:

Por Mania

Claber

1716 de clabLevel

3 tutoriales
2 articulos

 

Astrub

firefox
Citar            
MensajeEscrito el 30 Nov 2005 06:30 pm
En realidad eso no es tan cierto, de hecho por eso lo pongo a NULL de nuevo... :P

Por Aoyama

BOFH

6224 de clabLevel

6 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Bastard Operators From Hell

Webdesigner & Developer, en mis ratos libres bebo café por litros.

firefox
Citar            
MensajeEscrito el 01 Dic 2005 10:00 am
:roll: No se ve la imagen del error corrigele pa ver que ondas :wink: y porque no posteas los metodos???... :roll:

Por choco

425 de clabLevel



Genero:Masculino  

Estado de México, México

firefox
Citar            
MensajeEscrito el 01 Dic 2005 10:37 am
Ummmm... pensando he recordado un error muy parecido que me dió cuando estaba empezando (hace ya algun tiempo).

No recuerdo muy bien la solución pero ¿has probado a ponerlo a NULL al principo del for en vez de al final?

*Mania se va para casa y empieza a revolver su armario en busca de sus antiguos apuntes de clase*

Por Mania

Claber

1716 de clabLevel

3 tutoriales
2 articulos

 

Astrub

firefox
Citar            
MensajeEscrito el 02 Dic 2005 04:58 pm
Nada, nada, ya lo resolví, el compilador se me aloca por exceso de punteros (que raro de C ... U_U ) lo resolví de está manera:

Código :

void setNombre(char *n)
{
         nombre = new char[strlen(n)+1]; 
         strcpy(nombre, n);
} 


Lo único que hago es convertir el puntero en un char con la mismo longitud-1 del puntero que le paso como parámetro... :P

Ahora tengo un nuevo problema: resulta que al momento de eliminar un registro del archivo me hace cosas extrañas y no elimina nada... este es mi código...

Código :

bool DbClientes::Eliminar(int i)
{
     bool hallado = false;
     char opcion;
     fstream lecto;     
     lecto.open("clientes.dat", ios::in | ios::out | ios::binary);

     lecto.seekg(0, ios::beg);
     while(!lecto.eof())
     {
          lecto.read(reinterpret_cast<char *>(&cliente), sizeof(cliente));
        cout<<cliente.getNombre()<<endl;
        if (cliente.getID() == i)
        {

           cout<<"Cliente Hallado, Borrar? (s /n):";
           cin>>opcion;
           if(opcion=='s' || opcion=='S')
           {
              cliente.setBorrado(); // Establece el registro como borrado
              lecto.write(reinterpret_cast<char *>(&cliente), sizeof(cliente));
              hallado = true;
           }
           else hallado = true;
           break;

        }


     }
     if(lecto.eof() || !hallado)
          cout<<"No se encontro el cliente";
     lecto.close();
     return hallado;
}

Por Aoyama

BOFH

6224 de clabLevel

6 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Bastard Operators From Hell

Webdesigner & Developer, en mis ratos libres bebo café por litros.

firefox
Citar            
MensajeEscrito el 02 Dic 2005 04:59 pm

choco escribió:

:roll: No se ve la imagen del error corrigele pa ver que ondas :wink: y porque no posteas los metodos???... :roll:


El servidor estuvo caido unos días... sólo eso... públiqué sólo el método que realmente importa, lo demás funcionaba bien, hasta que realice el método de eliminar (el del post de arriba)

Por Aoyama

BOFH

6224 de clabLevel

6 tutoriales
12 articulos

Genero:Masculino   Anime Bloggers Bastard Operators From Hell

Webdesigner & Developer, en mis ratos libres bebo café por litros.

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.