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!!!