[c++] Wczytywanie substringu

0

Mój problem polega na tym że:
Mam format pliku , którego szablon wygląda tak:

<mdbf version?0.1>
<data>
  <imie>Eustachy</imie>
  <nazwisko>Kowadełko</nazwisko>
</data>
</mdbf>

Jak widać podobny do xml'a czy html'a .
Chciałbym teraz w programie wczytać do stringów :
-numer wersji
-to co znajduje się pomiędzy <imie> a </imie>
-analogicznie z nazwiskiem

Generalnie progblem polega na tym że nie wiem jak wczytać substring pomiędzy <> a </>

0
string linia;
int start, end;

linia = "<mdbf version?0.1>";
start = linia.find("version?",0);
end = linia.find('>', start);
string wersja = linia.substr(start,end-start);

linia = "  <imie>Eustachy</imie>";
start = linia.find("<imie>",0);
end = linia.find("</imie>", start);
string imie = linia.substr(start,end-start);

linia = "  <nazwisko>Kowadełko</nazwisko>";
start = linia.find("<nazwisko>",0);
end = linia.find("</nazwisko>", start);
string nazwisko = linia.substr(start,end-start);

cout << "V:" << wersja << endl << "I:" << imie << endl << "N:" << nazwisko << endl;
0

Dzięki, a mógłbyś mi jeszcze wytłumaczyć po co jest to start i end ?

0

start ci mowi w ktorym miejscu zaczyna sie 'version', a end mowi gdzie znajduje sie '>' ktory oznacza koniec stringu ktory cie interesuje czyli wersja.

0
quetzalcoatl (niezalogowany) napisał(a)
string linia;
int start, end;

linia = "  <imie>Eustachy</imie>";
start = linia.find("<imie>",0);
end = linia.find("</imie>", start);
string imie = linia.substr(start,end-start);

linia = "  <nazwisko>Kowadełko</nazwisko>";
start = linia.find("<nazwisko>",0);
end = linia.find("</nazwisko>", start);
string nazwisko = linia.substr(start,end-start);

Tu jest mały błąd: start wskazuje na początek taga, a nie na wartość.

0

dziwne, wynikiem działnia programu jest:

V:version?0.1
I:<imie>Eustachy
N:<nazwisko>Kowadełko

linia.find() zwraca unsigned int do początku substringu , więc trzeba by było jeszcze jakoś dodać do niej wartość długości substringu <...>

Edit:
Jak zacząłem pisać tego posta, twojego jeszcze nie było

0

Pisałem, że jest tam błąd i dlaczego jest, więc pomyśl trochę...

Na ułatwienie dodam, że find zwraca indeks pierwszej litery znalezionego wyrazu lub string::npos jeżeli nic nie znajdzie.

0

Ja bym to zrobił tak:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
fstream plik("plik.mdbf" , ios::in);

string calosc ,linia;
while ( getline ( plik, linia ) ) 
calosc += linia + "\n";

int start, end;

string sub_1("version?");
start = calosc.find(sub_1,0);
start = start + sub_1.size();
end = calosc.find('>');
string wersja = calosc.substr(start,end-start);

string sub_2("<imie>");
start = calosc.find(sub_2,0);
start = start + sub_2.size();
end = calosc.find("</imie>", start);
string imie = calosc.substr(start,end-start);

string sub_3("<nazwisko>");
start = calosc.find(sub_3,0);
start = start + sub_3.size();
end = calosc.find("</nazwisko>", start);
string nazwisko = calosc.substr(start,end-start);

cout << "Versja:" << wersja << "\n" << "Imie:" << imie << "\n" << "Nazwisko:" << nazwisko << "\n";
}

Możesz mi teraz powiedzieć twój sposób ?

0

0x666 - punkt, zapomnialem dodac do startu strlena z taga :)

0

Możesz mi teraz powiedzieć twój sposób ?

A po co, przecież już sam sobie odpowiedziałeś?

0
quetzalcoatl (niezalogowany) napisał(a)

0x666 - punkt, zapomnialem dodac do startu strlena z taga :)

ps - zawsze tak jest jak nie dam disclaimera ;]

0
0x666 napisał(a)

Możesz mi teraz powiedzieć twój sposób ?

A po co, przecież już sam sobie odpowiedziałeś?

Bo chciałbym poznać twój sposób, to było coś z strlen ?

0

Mój sposób byłby mniej więcej taki sam jak twój, więc nie widzę sensu podawania go.

PS. jak używasz string'a to zapomnij o strxxx

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