Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

BCB: klasa -> vektor -> bin.file neocekivan rezultat

[es] :: C/C++ programiranje :: BCB: klasa -> vektor -> bin.file neocekivan rezultat

[ Pregleda: 2091 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Duke Nukem
Miroslav Mitic
dipl.mas.ing - tehnolog za hidrauliku/
REL, MAG panciranje i zavarivanje bla
bla...
Lazarevac

Član broj: 38933
Poruke: 143
*.absolutok.net.



+1 Profil

icon BCB: klasa -> vektor -> bin.file neocekivan rezultat08.10.2005. u 11:35 - pre 225 meseci
U šta može da se izrodi trivijalan problem
Trebalo je vektor napuniti korisnički definisanom klasaom a zatim sve
to upisati u fajl a zatim sve to i pročitati, ali avaj rezultat čitanja iz fajla je potpuno
neočekivan:


Code:

// Binarna klasa koja ide u vektor a zatim u fajl ali sta izlazi iz fajla ??? 

class binar
 {
 public:
  binar() :_age(0),_name("default") {}
  binar(int age) : _age(age),_name("defaut") {}
  binar(int age, String name) :_age(age),_name(name) {}
//  binar(binar &rhs) ; // ovi su izbaceni namerno 
//binar& operator = (binar &rhs);
void setAge(int age) {_age= age;}
void setName (String name) {  _name= name; }

bool operator == (binar &rhs);
bool operator < (const binar rhs);

int age() { return _age; }
String name() { return _name; }

 private:
 int _age;
 String _name;
 };


//-----------------------------------------------------------

void binar_toFile()
// pravi vektor sa binarnim klasama i upisuje ih u fajl
{
  binar *temp;

  int i; char s[10];

  vector<binar> elemetni;

  char c;

  while (c!= 'c' )

   {

    cout<< "Unesi y za podatke za klasu 'binar' karakter 'c' za kraj " << endl;
    cin >> c;

    if(c== 'c') break;

    cout<< " Unesi naziv "<< endl;

    cin >> s;

    cout<< " Unesi id "<< endl;

    cin >> i;

    temp= new binar(i,s);

//    temp.setAge(i);  temp.setName(s);

    elemetni.push_back(*temp);

    delete temp;

   }

cout<<endl<<endl << "vektor elementi napunjen sledi upis u fajl" << endl;

 // upis u fajl

  ofstream out("Binar.bin", ios::binary|ios::app);

  char  niz[1000];

  if(!out)

   {
    cerr << "Ne moze da otvori fajl ";
    return;
   }

 for(vector<binar>::size_type i= 0; i< elemetni.size();i++) // ne idemo preko iteratora ...
 {

 binar  temp= elemetni[i];

  out.write((char*)&temp,sizeof(temp));

  cout << temp.name() << "  " << temp.age() << endl; // kontrola
 }

 out.close();

cout << "-------   kraj upisa u fajl ------------------"<< endl;
}

//------------------------------------------------------------
void binar_from_File()
 {
  // ucitava podatke iz  binarnog fajla i prikazuje na std.out

  vector <binar> elemetni;

   binar temp;

   char niz [1000];

   int duzina= sizeof(temp);

   int i;

    ifstream in("Binar.bin", ios::binary);

    in.seekg(ios::beg);
      do {
           in.read(niz, duzina);
           i= in.gcount();
           binar* t= reinterpret_cast<binar*> ( niz) ;       
               
           elemetni.push_back(temp);
       }
       while( i==duzina);
    in.close();

 cout<< "Da vidimo sta smo procitali " << endl;

for(vector<binar>::size_type i= 0; i< elemetni.size();i++)
  {

  temp= elemetni[i];
  cout<< temp.age() << "  " << temp.name() << endl;

  }
 }
// ----------------------------------------------------------------

int main (int argc, char **argv) {
binar_toFile() ;
binar_from_File();




rezultat izlaza iz fajla su podaci default konstruktora
0 default
0 default itd ???

i kako to ???
Tape loading error
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.claranet.co.uk.



+4 Profil

icon Re: BCB: klasa -> vektor -> bin.file neocekivan rezultat08.10.2005. u 19:34 - pre 225 meseci
Code:
elemetni.push_back(temp);


Pogledaj josh jedared shta ti uopshte stavljash u vektor pri uchitavanju. Ja koliko vidim, uvek stavljash 'temp' koji je samo jednom kreiran (zato i jeste 'default'), a ne kopirash elemente koje uchitavash.

Inache, kod ti je jako, jako losh. Nadam se da si tek u fazi cheprkanja kako 'taj C++' funkcionishe
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.90.*



Profil

icon Re: BCB: klasa -> vektor -> bin.file neocekivan rezultat09.10.2005. u 13:12 - pre 225 meseci
Ovo ne valja...
Code:

out.write((char*)&temp,sizeof(temp));


sizeof binar klase je verovatno 20-ak bajtova (4 za int i jos nekoliko za interne podatke stringa) i velicina klase se ne menja u zavisnosti od velicine stringa _name.

U tvom primeru, ti zelis da snimis celu klasu u file ali snimice se samo podaci koji se zaista nalaze unutar klase. Sadrzaj na koji interni char* pointer (koji se nalazi unutar stringa) pokazuje nece biti snimljen ali ce zato pointer biti snimljen, sto je besmisleno.

Predlazem ti da napravis iostream operatore << i >> i tu implementiras snimanje i ucitavanje ili napisi par funkcija SaveToFile(FILE* f) i LoadFromFile(FILE* f) i tu uradi istu stvar.

yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: BCB: klasa -> vektor -> bin.file neocekivan rezultat

[ Pregleda: 2091 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.