Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » TextDatenbank

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.04.2004, 03:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi ich wollte mal wieder ein wenig mit Klassen rumspielen um das nicht total zu verlernen und hab mir gedacht ich bastel mir so ne art textdatenbank


C++:
#include <iostream>
#include <vector>
#include <fstream>
#include <string>

template <int n>
class Record{
    public:
        Record();
        int record_size();
        std::string& operator[](int index);
        friend std::ostream& operator<<(std::ostream& , Record&);
        friend std::istream& operator>> (std::istream&, Record&);                  
    private:
        std::vector<std::string> record;
};

template <int n>
Record<n>::Record(){record.resize(n);}


template <int n>
int Record<n>::record_size(){return record.size();}
        
template <int n>
std::string& Record<n>::operator[](int index){return this->record[index];}
                

template <int n>
std::ostream& operator<<(std::ostream& os,Record<n>& r){
    for(int i=0;i<r.record.size();++i)
        os<<r.record[i]<<"\t";
    os<<std::endl;
    return os;
}

template <int n>
std::istream& operator>>(std::istream& is, Record<n>& r){
    for(int i=0;i<r.record.size();++i)
        is>>r.record[i];
    return is;
}




template <class Typ>
class txtDB{

    public:
        txtDB(const char* filenname);
        ~txtDB(){};
        
        bool insert_record(Typ &record);
//        bool update_record(Typ &record);
//        bool delete_record(Typ &record);
//        bool exist_record(Typ &record);
//        Typ select_record();

        int db_size();
        Typ& operator[](int index);
        friend std::ostream& operator<<(std::ostream&,txtDB<Typ>&);
        friend std::istream& operator<<(std::istream&,txtDB<Typ>&);

        private:
        std::string filename;
        std::vector<Typ> db;
    
};


template <class Typ>
txtDB<Typ>::txtDB(const char* filenname){

    this->filename=filename;
    std::ifstream is(filenname);
    if(is.is_open()){
        this->db.resize(4);
        is>>*this;
        is.close();
    }
}


template <class Typ>
bool txtDB<Typ>::insert_record(Typ &record){
    db.push_back(record);
return true;
}



template <class Typ>
int txtDB<Typ>::db_size(){return this->db.size();}


template <class Typ>
Typ& txtDB<Typ>::operator[](int index){return this->db[index];}

template <class Typ>
std::ostream& operator<<(std::ostream& os, txtDB<Typ>& tdb){
    for(int i=0;i<tdb.db_size();++i)
        os<<tdb[i];
    return os;
}


template <class Typ>
std::istream& operator>>(std::istream& is, txtDB<Typ>& tdb){
    for(int i=0;i<tdb.db_size();++i)
        is>>tdb[i];
    return is;
}
    

int main(){


Record<3> mr;
mr[0]="41775";mr[1]="100123";mr[2]="Tekken";

txtDB<Record<3> > db("test.txt");

db.insert_record(mr);
db.insert_record(mr);

std::cout<<db;

return 0;
}





das eigentlich problem ist hier

C++:

template <class Typ>
std::istream& operator>>(std::istream& is, txtDB<Typ>& tdb){
    for(int i=0;i<tdb.db_size();++i)
        is>>tdb[i];
    return is;
}


und zwar will ich wenn ich am anfang den konstruktor mit nem dateinamen aufrufe das der dann halt die datenbank aus der datei einliest?
wie mach ich das am besten. Ich könnte natürlich am anfang der datei eine anzahl der datenstätze speichern und dann im konstruktor entsprechend rezise aufrufen damit dann das mit dem >>operator so klappt wie ich mir vorstelle...
an welcher stelle dreht man da am besten? sollte ich den operator verändern?
will ich eigentlich lieber nicht aber wenn ich das mache muss ich im konstruktor ja wieder die records einzeln einlesen und dann kann ich mir den operator>> ja auch sparen...

hat jemand ne idee...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 23.04.2004 um 11:18 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.04.2004, 09:04 Uhr
(un)wissender
Niveauwart


Du könntest deinen operator[] erweitern auf Bereichsüberprüfung, und wenn zu klein dann resize.
Dazu würde noch gehören, dass du einliest bis feof kommt oder so, halt ein Stoppzeichen.
Das würde dein Problem lösen, ist allerdings nicht extrem performant.
Solltest du aber soweiso machen, da eine db schon testen sollte, ob der Zugriff valide ist, scheiß auf performance.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.04.2004, 10:03 Uhr
(un)wissender
Niveauwart


Vielleicht hilft dir das...


C++:
#include <iostream>
#include <fstream>
#include <vector>

class DB
{
public:
    DB(const char * fileName = 0);
    friend std::istream & operator>>(std::istream &in, DB &db);
    friend std::ostream & operator<<(std::ostream &out, const DB &db);
    //Zum lesen
    const int& operator[](size_t index) const;
    //Zum schreiben
    void addElementAt(size_t index, int element);
    
private:
    std::vector<int> storage;
    
};

DB::DB(const char * fileName)
{
    if(fileName)
    {
        std::ifstream in(fileName, std::ios::binary |  std::ios::in);
        in >> *this;
        in.close();
    }
}

void DB::addElementAt(size_t index, int element)
{
    if(storage.size() <= index)
    {      
        storage.resize(index + 1);
    }  
    storage[index] = element;    
}

const int& DB::operator[](size_t index) const
{      
    return storage[index];
}

std::istream & operator>>(std::istream &in, DB &db)
{
    int element;
    if(in)
        in.read(reinterpret_cast<char *>(&element), sizeof(int));
    for(unsigned int i = 0; in; ++i)
    {                    
        db.addElementAt(i, element);
        in.read(reinterpret_cast<char *>(&element), sizeof(int));
    }
    
    return in;
}

std::ostream & operator<<(std::ostream &out, const DB &db)
{
    typedef std::vector<int>::const_iterator vecIter;
    for(vecIter i = db.storage.begin(), end = db.storage.end();
        i != end;
        ++i)
    {              
        out.write(reinterpret_cast<const char *>(&*i), sizeof(int));
    }
    
    return out;
}

int main(int argc, char *args[])
{
    if(argc > 2)
    {
        std::ofstream out(args[1], std::ios::binary | std::ios::out);
        int testValues[] = { 11, 12, 13, 345};
        int testValuesLength = 4;
        out.write(reinterpret_cast<const char *>(&testValues[0]),
                  testValuesLength *  sizeof(int));    
        out.close();
        DB db(args[1]);
        std::ofstream outResult(args[2], std::ios::binary | std::ios::out);
        outResult << db;
        outResult.close();
            
    }
    return 0;
}


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 23.04.2004 um 11:18 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.04.2004, 12:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hey unwissender du hast plan davon... das ja supi. guck ich mir mal heute abend an und nerv dich dann ggf weiter
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.04.2004, 14:34 Uhr
(un)wissender
Niveauwart


Bin heute abend nicht da, erst morgen mittag wieder...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.04.2004, 14:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


is ja auch nicht so eilig, wollte nur mal ein wenig mit rumspielen.
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: