biesczadka 0 Newbie Poster

I have a template which can be initialized with container list, vector or my own create container zbior and struct element as an El:

template<typename El, int colsNo, typename Container>
struct CSVReaderWriter {
	 Container m_cont;
void read (std::istream & _input) {
	string linijka;
	vector<string> entry;
	   string laaa, naa;
	int ii=0;


	while (getline(_input,linijka,'\n')) {

	if(linijka=="") continue;
	while(linijka[ii] != ',') {laaa+=linijka[ii]; ii++;}
	entry.push_back(laaa);
	ii++;
	laaa.clear();
	while(linijka[ii] != '\n') {laaa+=linijka[ii]; ii++;}
	entry.push_back(laaa);
	   m_cont.push_back(El(entry));
	ii=0;
	laaa.clear();
	linijka.clear();
	entry.clear();
	
	}

	
	 }

void write (std::ostream & _output) {
	 typename Container::iterator i = m_cont.begin();

	 for (; i!=m_cont.end(); ++i){
		_output<<(*i).t;
		_output<<',';
		_output<<(*i).w;
		_output<<endl;
		
}
   
   }



	   

   
};

this is my template zbior:

template <typename Typ, Typ *neutral> class zbior{
	int _rozmiar;
	Typ *ti;
	static const int DomysRoz=5;
public:
	explicit zbior(int rzm=0);
	zbior(const zbior &nps );
	int LiczEl();	
	void push_back(Typ ww);
	friend ostream &operator << <>(ostream &os, const zbior<Typ,neutral> &k);
	class iterator;
	friend class iterator;
	class iterator{
		zbior& s;
		int index;
	public:
		iterator(zbior& st) {s(st); index=0;}
		iterator(zbior& st, bool) {s(st); index=(st._LiczEl+1);}
		Typ operator*() const {return s.ti[index];};
		Typ operator++() {return s.ti[++index];};
		iterator begin() {return iterator(*this);};
		iterator end() {return iterator(*this,true);};
	
		
	};

};

and functions:

emplate <typename Typ, Typ *neutral> zbior<Typ,neutral>::zbior(int rzm){
	_rozmiar=rzm;
	ti=new Typ[_rozmiar];
	for (int ix=0; ix<_rozmiar; ++ix){
		ti[ix]=*neutral;
		
	}
	
}

template <typename Typ, Typ *neutral> zbior<Typ,neutral>::zbior(const zbior &nps ){
int ix;
	_rozmiar=nps._rozmiar;
	if( ! nps.ti)
		ti=0;
	else{
		ti=new Typ [_rozmiar+1];
		for (int ix=0; ix<_rozmiar; ++ix){
		ti[ix]=nps.ti[ix];
		
	}
	}
}

template<typename Typ, Typ *neutral> 
ostream &operator << (ostream &os, const zbior<Typ,neutral> &k)
{
	for (int ix=0; ix<k._rozmiar; ++ix){
		 os << k.ti[ix]<<" ";}
return os;
} 

template <typename Typ, Typ *neutral>  int zbior<Typ,neutral>::LiczEl(){
int n=0;
for(int i=0; i<_rozmiar; i++)
{
	if(ti[i] != *neutral) {++n;};
}
return n;
}

template <typename Typ, Typ *neutral> void zbior<Typ,neutral>::push_back(Typ ww){
	int i=0;
	int ix=0;
	if(_rozmiar<=0) {
	zbior<Typ,neutral> tymcz (*this);
	_rozmiar=(_rozmiar+DomysRoz);
	delete [] ti;
	ti= new Typ[_rozmiar];
	for(ix=0; ix<(tymcz._rozmiar); ++ix) {ti[ix]=tymcz.ti[ix];}
	ti[ix]=ww;
	for(i=(ix+1); i<(_rozmiar); ++i) {ti[i]=*neutral;}
		}
else{
			
while (ww!=ti[ix] & ix<_rozmiar) {ix++;}

if (ix==_rozmiar) {
		if ((LiczEl())==_rozmiar) {
						zbior<Typ,neutral> tymcz (*this);
						_rozmiar=(_rozmiar+DomysRoz);
						delete [] ti;
						ti= new Typ[_rozmiar];
						for(ix=0; ix<(tymcz._rozmiar); ++ix) {ti[ix]=tymcz.ti[ix];}
						ti[ix]=ww;
						for(i=(ix+1); i<(_rozmiar); ++i) {ti[i]=*neutral;}
					}
		else { ix=0; while (ti[ix]!=*neutral & ix<_rozmiar) {ix++;} ti[ix]=ww;}
		}
else {; }
}
}

struct element:

struct element {
	int t,w;
	element(int a=0, int b=0) {t=a; w=b;};
	element (const std::vector<std::string> & _input) {
	t = text_cast<int,string>(_input[0]);
	w = text_cast<int,string>(_input[1]);
	}
	bool operator==(const element);
	void operator=(const element j) {t=j.t; w=j.w;}
	bool operator!=(const element j) {return (t!=j.t || w!=j.w);}

};

std::ostream &operator << (std::ostream &os, const element &k)
{
   return os<<"t:"<<k.t<<" w:"<<k.w;
} 

bool element::operator==(const element p){
return((*this).t==p.t & (*this).w==p.w);
}

and this is text_cast:

template<typename To, typename From>
To text_cast (const From  &_from) {
stringstream str;
To _to;
str << _from;
str >> _to;
return _to;
}

this is my main:

#include <iostream>
#include "testy.h"
#include <iostream>
#include <string>
#include <fstream>
#include <istream>
#include <vector>
#include <iterator>
#include <list>






int main(){





CSVReaderWriter<element,2,zbior<element,&k> > klaska;
CSVReaderWriter<element,2,vector<element> > klass;
CSVReaderWriter<element,2,list<element> > klasaa;


ifstream plikwe("odczyt.csv");
klaska.read(plikwe);
plikwe.close();

ofstream pl("zapis.csv");
klaska.write(pl);
pl.close();

/*ifstream plikw("odczyt.csv");
klass.read(plikw);
plikw.close();

ofstream plikk("zapis.csv");
klass.write(plikk);
plikk.close();*/


/*ifstream plik("odczyt.csv");
klasaa.read(plik);
plik.close();

ofstream pli("zapis.csv");
klasaa.write(pli);
pli.close();*/




getchar();
	return 0;
}

For list and vector everything works correct, but for ccontainer zbior only function read works because write does not. There is a problem with overloading iterators. But I have no idea where. Please help me! It's very important b eacuse it's my project for school!!!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.