» »

c++ seznam objektov, vektorji

c++ seznam objektov, vektorji

PunXXX ::

Pozdravljeni!
Imam sledeč problem.
Narediti moram program kateri iz prebranih podatkov (iz datoteke) tvori objekte razreda DruzinskaOseba in Druzina, nato moram napolniti vektor družin s pravkrar ustvarjenimi objekti.

Podatke iz datoteke pravilno prebere.
Problem je, da na koncu, ko kličem metodo za izpis (kateri izpišem vsebino vektorja) se mi vedno izpiše le priimek, družine članov pa ne izpiše nikoli.

Predvidevam, da je problem v main-u (na tistem delu, kjer kličem metodo dodajClana) (če se motim me prosim popravite)
Vem da morem še nekako alocirat pomnilniški prostor za vsak objekt ustvarjenega seznama, spodaj je objavljen moj propadli poskus delanja le tega :).

Druzina *Druzine = new Druzina[20];
Druzina *dr;
for
{
dr= new Druzina;
Druzine[i]= dr;
}



Naloga: (kode nisem mogel prilepiti ker me je konstantno opozarjalo na nek nedovoljen znak :S)
http://rapidshare.com/files/239012780/v...

Lepo prosim za pomoč.

Tutankhamun ::

               for(izpis=seznam.begin(); izpis<seznam.end(); izpis++)
               {
                   string rezultat=(*izpis).getFunkcija();
                   if(rezultat=="oce")
                   {
                       cout<<"oce: ";
                       (*izpis).izpis();
                       oce=true;
                   }
                   
                   if(rezultat=="mati")
                   {
                       cout<<"mati: ";
                       (*izpis).izpis();   

Tuki vedno dobiš v rezultat, funkcijo člana na koncu je pa presledek?
Primer: "oce "
Ti pa pol to primerjaš s samo "oce", kar pa valda nikol ni pravilno. Več pa pol nisem gledal, ker je nekam pozn.
Če pa še ne bo šlo, pa povej, pa še enkrat mal pogledam :P.
AMD Phenom QUAD 9950 Black Edition, 8GB

PunXXX ::

Sem preveril.
Še vedno ne deluje.
Konkretno izpis metoda mi pravilno deluje problem je pomoje pri seznamu (tabeli) objektov v main delu:
Druzina *Druzine = new Druzina[20];....

Tutankhamun ::

To zakaj si tuki ročno alocirov memorijo mi tut ni jasn.
Js bi naredu samo
Druzina Druzine[20];
Pa se znebiš 5 vrstic kode, pri tebi.
Po zajtrku bom pa še enkrat pogledu.
               for(izpis=seznam.begin(); izpis<seznam.end(); izpis++)
               {
                   string rezultat=(*izpis).getFunkcija();
                   cout << rezultat << "xxx" << endl; // dodaj to v svojo kodo
                   if(rezultat=="oce")


Dej tist izpis ustav v svojo kodo, pa povej kaj dobiš v konzoli...
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

PunXXX ::



levo okence je izpis programa takrat, ko berem podatke iz datoteke (main del beri.txt itd.;
desno pa ob naključnem klicu neke družine;

Druzina d2("Music");
d2.dodajClana(DruzinskiClan("Tomaz", 1970, "oce"));
d2.dodajClana(DruzinskiClan("Lidija", 1971, "mati"));
d2.dodajClana("Jurij", 2007, "sin");
d2.dodajClana("Zarja", 2001, "hci");
Druzine[1]=d2; //tukaj izpis deluje pravilno
Druzine[1].izpis();

Tutankhamun ::

Sploh nevem več kaj je težava. Sm mislu, da ti ne izpiše članov, vidm pa v screenshotu, ko si ga ti dal, da ti jih izpiše. Kaj ti ne dela?

A imam js enako kodo kot ti? Ker pri meni so na koncu presledki...
 Izpis konzole

Izpis konzole

AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

ofstream out("clan.txt", ios::out | ios::binary);

Če že daš ofstream, ti ni treba pisat ios::out. Ker pa zapisuješ text, ti pa tudi ni treba pisat ios::binary.
Napišeš samo
ofstream out("clan.txt");

Enako pa velja za ifstream!

Ampak men še zmer ne dela tko kot tebi :P.

A imaš Visual Studio, al maš kej druzga, Borland ...?
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

Lej
string toString()
{
     stringstream ss;
     ss<<getIme()<<" "<<getRojstvo()<<" "<<getFunkcija()<<" ";
     return ss.str();
};

Tole imaš v eni funkciji in tale string ti potem shraniš v datoteko. Kot vidiš je na koncu presledek. Ti ga sam tja postaviš. Kako je zdej možn če to shraniš, da tvoj progi tega ne prebere in ti izpiše ocexxx namesto oce xxx, tako kot pri meni?
Neki tuki ne štima. Sm 100%, da nimam enake kode kot ti.
Js bom zdej ta presledek vn vrgu!
Ti pa povej kaj ti ne dela, kot bi ti hotu.
AMD Phenom QUAD 9950 Black Edition, 8GB

PunXXX ::

Člane mi je izpisalo takrat ko sem jih ročno dodal (primer kode je v mojem predzadnjem postu)

Samo xxx pa izpiše tam kjer berem iz datoteke:
Del kateri ne deluje(izseki iz kode):

Druzina temp;
temp.setPriimek(s); //to še deluje (izpiše samo priimke družin)
temp.dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]); //tukaj članov ne izpisuje oz jih ne doda v vektor
Druzine[skupajDruzin]=temp;

v mainu pač izpišem s for zanko iz seznama objektov (koliko družin pač je) (Druzine[i].izpis(); )

PunXXX ::

Presledek sem že prej odstranil kot si mi rekel, uporabljam pa devc++
lp

Tutankhamun ::

Popravil sem še eno čudno funckijo split!
Popravljena
void stringSplit(string str, string podatki[])
{
    int indeks=0;
    int velikost=str.length();

	size_t found, found2;

	found = str.find(" ");
	podatki[indeks++]=str.substr(0, found);

	found2 = found;
	found = str.find(" ", found2+1);
	podatki[indeks++]=str.substr(found2+1, found - found2 - 1);

	found2 = found;
	found = str.find(" ", found2+1);
	podatki[indeks++]=str.substr(found2+1, found - found2 - 1);
}

Zdej bom pa pregledu še to za kar sprašuješ.
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

A problem naj bi bil tukaj? Mal sm odkomentirov, a je to prov, al morem pustit zakomentiran?
             if(zacni==true) //zacnemo vpisovat
             {
                 Druzina temp;
                 for(int i=0; i<kolikoKrat+1; i++)
                 {
                     getline(beri, s);
                     if(i==0) //vpisemo Priimek druzine
                     {
                              
                         Druzine[skupajDruzin].setPriimek(s);
                         cout<<"priimek: "<<s<<endl;
                         Druzina temp(s);
                         Druzine[skupajDruzin]=Druzina(s);
                         temp.setPriimek(s);
                     }
                     else //dodamo družinskega &#232;lana
                     {
                         stringSplit(s, osebaPodatki); //lo&#232;imo prebrano vrstico na 3 dele (ime, leto rojstva in funkcijo)
                         cout<<"Ime: "<<osebaPodatki[0]<<endl;
                         Druzine[skupajDruzin].dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]);  //drugi argument pretvorimo v int
                         temp.dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]);
                     }
                     
                     
                 }
                 Druzine[skupajDruzin]=temp;
                 temp.izpis();
                 skupajDruzin++; //povecamo skupno stevilo družin
                 zacni=false;
                 
             }
AMD Phenom QUAD 9950 Black Edition, 8GB

PunXXX ::

Tisto zakomentirano čudo so bili pač moji poskusi, da bi naredil delujočo kodo.
če zakomentiraš (vse)
temp.dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]);
in
odkomentiraš
Druzine[skupajDruzin].dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]);
bo delovalo isto.

Edini stvari kateri sta odvečni (preverjal sem če dobi metoda pravile vhodne podatke v argumente)
kjer izpišemosebaPodatki[0]

ter

temp.izpis();

Tutankhamun ::

Nevem če zastopim najbolj, kaj je problem?
 konzola

konzola


A bi mogu bit kšn drugačn izpis?
AMD Phenom QUAD 9950 Black Edition, 8GB

Tutankhamun ::

Zdej sm odstranu, use kar si imel zakomentiran, pa prvi del, kjer vpisuješ v datoteko
int main(int argc, char *argv[])
{
//branje družinskih &#232;lanov iz datoteke
     ifstream beri;
     string s;
     string osebaPodatki[3];
     bool zacni=false;
     int kolikoKrat=0;
     Druzina Druzine[20];

     int skupajDruzin=0; //koliko družin že imamo v seznamu

     beri.open("clan.txt");
     if(beri) 
     {
         while(getline(beri, s)) 
         {
             if(getStevilo(s)!=0 && zacni==false) //&#232;e je v stringu podano samo število
             {
                 zacni=true;
                 kolikoKrat=getStevilo(s); //dobimo kolikšno je število &#232;lanov družine
             }
             
             if(zacni==true) //zacnemo vpisovat
             {
                 //Druzina temp;
                 for(int i=0; i<kolikoKrat+1; i++)
                 {
                     getline(beri, s);
                     if(i==0) //vpisemo Priimek druzine
                     { 
                         Druzine[skupajDruzin].setPriimek(s);
                     }
                     else //dodamo družinskega &#232;lana
                     {
                         stringSplit(s, osebaPodatki); //lo&#232;imo prebrano vrstico na 3 dele (ime, leto rojstva in funkcijo)
                         Druzine[skupajDruzin].dodajClana(osebaPodatki[0], atoi(osebaPodatki[1].c_str()), osebaPodatki[2]);  //drugi argument pretvorimo v int
                     }
                 }

                 skupajDruzin++; //povecamo skupno stevilo družin
                 zacni=false;
             } 
         }
     }
     else
     {
         cout<<"napaka"<<endl;
     }
      
      beri.close();
      beri.clear();
     
     for(int i=0; i<skupajDruzin; i++)
     {
         Druzine[i].izpis();
     }

    system("PAUSE");
    return EXIT_SUCCESS;
}


Pa dobim rezultat
 konzola

konzola



Men se zdi use ok, kaj pa teb?
AMD Phenom QUAD 9950 Black Edition, 8GB

PunXXX ::

Sedaj sem prekopiral tvojo kodo v moj main in še vedno ne dela.
Sedaj sem celoten projekt spravil v visual studio okolje in še vedno ne deluje. (Izpiše samo priimek družine brez njenih članov)

V katerem okolju ti poganjaš ta program.
Ali bi ga lahko kam naložil da ga še jaz poženem? Kajti res ne vem kaj je sedaj vse to tebi dela, meni ne.

Tukaj sem naložil prekopirano nalogo (visual studio)
http://rapidshare.com/files/239207393/v...
Povej mi prosim, če ti deluje pravilno (meni ne).

lp

Tutankhamun ::

Seveda ti ne dela. Reku si, da si zradiral tist presledek na koncu, zdej ti pa stringsplit metoda ne dela več pravilno.
Nek bolj zgoraj, sem ti popravil stringsplit funkcijo. Prepiš jo, pa bo delal ;).
AMD Phenom QUAD 9950 Black Edition, 8GB

PunXXX ::

Joj budalo jz, tisti post sem pa čisto spregledal glede split string funkcije:)
Najlepša hvala za ves tvoj trud :)
Zahvaljujem se ti iz dna srca.

Lep dan še naprej.

Tutankhamun ::

Nekak tko bi pa js naredu. :)

class FamilyMember 
{
public:
	friend ostream &operator<<(ostream &stream, FamilyMember ob);
	friend istream &operator>>(istream &stream, FamilyMember &ob);

protected:
	string m_name;
	string m_birth; 
	string m_status;
};

ostream &operator<<(ostream &os, FamilyMember fm)
{
	os << fm.m_name << " " << fm.m_birth << " " << fm.m_status;

	return os;
}

istream &operator>>(istream &is, FamilyMember &fm)
{
	is >> fm.m_name >> fm.m_birth >> fm.m_status;

	return is;
}

class Family
{
public:
	friend ostream &operator<<(ostream &stream, Family fy);
	friend istream &operator>>(istream &stream, Family &fy);

	void Clear () 
	{
		m_members.clear ();
	}

protected:
	typedef vector <FamilyMember> vMembers;
	string m_lastName;	  
	vMembers m_members;
};

ostream &operator<<(ostream &os, Family fy)
{
	int membersCount = fy.m_members.size ();
	os << membersCount << endl;
	os << fy.m_lastName << endl;


	for (int i = 0; i < membersCount; i++)
		os << fy.m_members[i] << endl;

	return os;
};

istream &operator>>(istream &is, Family &fy)
{
	FamilyMember fm;

	int membersCount;

	is >> membersCount;

	is >> fy.m_lastName;

	for (int i = 0; i < membersCount; i++)
	{
		is >> fm;
		fy.m_members.push_back(fm);
	}

	// test for eof
	long loc = is.tellg ();
	is >> membersCount;
	if (!is.eof ())	is.seekg (loc, ios::beg);

	return is;
}


int main(int argc, char *argv[])
{
	typedef vector <Family> vFamilys;
	vFamilys familys;
	Family fy;

	ifstream ifs;
	ifs.open ("clan.txt");
	ifs.clear ();

	while (!ifs.eof ())
	{
		ifs >> fy;
		familys.push_back (fy);
		fy.Clear ();
	}

	ifs.close ();

	ofstream ofs;
	ofs.open ("clan1.txt");

	vFamilys::iterator iEnd = familys.end();
	for (vFamilys::iterator iCur = familys.begin (); iCur < iEnd; iCur++)
		ofs << *iCur;

	ofs.close ();

	return 0;
}


Samo vseh pointerčkov sm se znebu :).
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ DODAJANJE elementov iz datoteke v vektor

Oddelek: Programiranje
7867 (742) Tutankhamun
»

[Java] Problem s Scanner-jem

Oddelek: Programiranje
92308 (2102) Zlatan
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242296 (1931) Bela01
»

VC# čitanje iz datoteke in shranjevanje v polje

Oddelek: Programiranje
91110 (923) iceurb
»

Novi člani GeForce 7 serije

Oddelek: Novice / Grafične kartice
92898 (2464) simnov

Več podobnih tem