[C++]Problem z ładowaniem do pamięci bazy z pliku

0

Witam.

Mam problem. Otóż pracuje nad programem bazodanowym w którym rekordy będą zapisane w pliku XML no i teraz jestem na etapie pisania części odpowiedzialnej za ładowanie pliku do pamięci jednak napotkałem problem a mianowicie przy wczytywaniu bazy Ignorowane są wszystkie wpisy zaczynające się które są większe indeksem od 1.

Plik który program odczytuje wygląda tak:

<tg>elo</tg>
<tg>Baza</tg>
<entry>
	<elo>Kulfon</elo>
	<Baza>Plik</Baza>
</entry>
<entry>
	<elo>Kulfony1</elo>
	<Baza>Pliki</Baza>
</entry>
<entry>
	<elo>Kulfony2</elo>
	<Baza>Plik3</Baza>
</entry>
<entry>
	<elo>Kulfony3</elo>
	<Baza>Plik4</Baza>
</entry>

Czyli dla tego pliku program nie zależnie od podanej Pozycji w bazie wyświetla tylko kulfon i plik.

Tu zamieszczam kody źródłowe programu
DbControl.cpp:

#include "DbControl.h"
void DB::CreateDatabase(string PathDb)
{
    Dbase = new XMLParser;
    Dbase -> LoadFile(PathDb);
    if(Dbase->IsLoadFile()==true)
    {
        Db.resize(1);
        Db[0] = Dbase -> GetTagValues("tg");
        vector <string> Tmp;
        vector <string>Ttmp;
        Tmp = Dbase -> GetTagValues("entry");
        Db.resize(Tmp.size()+1);
        for(int z=0; z<Db[0].size(); z++)
        {
            Ttmp.resize(Tmp.size()+1);
            Ttmp = Dbase->GetTagValues(Db[0][z]);
            for(int i=1; i<Ttmp.size()+1; i++)
            {
            Db[i].push_back(Ttmp[z]);
            }
            Ttmp.clear();
        }
    }
}
string DB::GetEntryById(int x, int y)
{
    return Db[x][y-1];
} 

XmlParser.cpp:

#include "XmlParser.h"

using namespace std;
void XMLParser::LoadFile(string FileName)
{
    file_o.open(FileName.c_str(),ios::out);
    NameFile = FileName;
    while(!file_o.eof())
    {
        string tmp;
        getline(file_o,tmp);
        BuffFile+=tmp;
    }
    file_o.close();
}
string XMLParser::GetBuffer()
{
    return BuffFile;
}
vector<string> XMLParser::GetTagValues(string Name)
{
    vector<string> Values;
    int Istag = 0;
    for(int i=0; i<BuffFile.length(); i++)
    {
        if(BuffFile.substr(i,Name.length()+3)=="</"+Name+">" && Istag>=0)
        {
            Values.push_back(BuffFile.substr(Istag,(i-Istag)));
            i+=Name.length()+3;
            Istag = -1;
        }
        if(BuffFile.substr(i,Name.length()+2)=="<"+Name+">")
        {
            i+=Name.length()+2;
            Istag = i;
        }

    }
    return Values;
}
void XMLParser::SaveFile(string Values)
{
    file_w.open(NameFile.c_str(),ios::out|ios::in|ios::trunc);
    file_w << Values;
    file_w.close();
}
int XMLParser::IsLoadFile()
{
    if(BuffFile.length()>0) return 1;
    else return 0;
}
 

main.cpp:

 #include <iostream>
#include <cstdlib>
#include "DbControl.h"
#include "XmlParser.h"
#include <vector>
using namespace std;

int main()
{
    vector<string>tmp;
    XMLParser*plik = new XMLParser;
    plik->LoadFile("a.txt");
    tmp = plik->GetTagValues("Baza");

    for(int i=0; i<tmp.size(); i++)
    {
        cout<<tmp[i]<<endl;
    }
    DB*base = new DB;
    base ->CreateDatabase("a.txt");
    cout<<base ->GetEntryById(3,1);
}
0

zamiast pisać własny parser, który na 100% nie jest zgodny ze standardem, lepiej użyć gotowej do tego biblioteki.

0

Wpadłem na to co jest dokładnie problemem. Chodzi tu o metodę CreateDatabase z klasy DB a dokładnie o ten fragment kodu:

 Ttmp = Dbase->GetTagValues(Db[0][z]);
            for(int i=1; i<Ttmp.size()+1; i++)
            {
            Db[i].push_back(Ttmp[z]);
            }

Bo przy wywoływaniu np

cout<<Ttmp[1]; 

odpowiednie wartości tych danych są wyświetlane. Jednak dalej nie wiem jak go rozwiązać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1