Hej! Mam do zrobienia program, który na podstawie zadanej ścieżki kluczy np.(menu popup menuitem) wypisze na ekran linijki pliku, które się pod tym kluczem znajdują. Plik wygląda mniej więcej tak:
{
"menu":
{
"id": "file",
"value": "File",
"popup":
{
"menuitem":
[
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
A więc dla ścieżki z nawiasów program powinien wypisać na ekran:
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
Dodatkowo, plik może być o wiele dłuższy, klucze mogą mieć zupełnie inne, dowolne nazwy i mogą się one powtarzać pod różnymi elementami, przykładowo value należy do menu jak i do menuitem. Z tego względu stworzyłem system, który zadaną ścieżkę kluczy dzieli na słowa i wrzuca do tablicy stringów. Teraz ten system chciałbym wykorzystać właśnie do wyszukiwania tych kluczy oraz tego co się pod nimi znajduję w pliku, jednakże nie mam pojęcia jak się za to zabrać. Myślałem nad zliczaniem nawiasów klamrowych w pętli, żeby wiedzieć kiedy np. nawias przy menu się otwiera, a kiedy zamyka, tak żeby mieć zakres, z którym zakresem pliku pracować w następnym obiegu pętli przy okazji kolejnego klucza, ale nie jestem pewny, czy będzie to działać przy większych plikach. Kod źródłowy tego co dotychczas udało mi się stworzyć:
int main()
{
string nazwapliku;
string sciezka;
const char * spacja = " ";
string tab[100];
fstream plik_json;
cout << "Podaj nazwe pliku: ";
getline(cin, nazwapliku); //wczytywanie nazwy z klawiatury (calej linii wlacznie ze spacjami)
plik_json.open(nazwapliku, ios::in); //otwieranie do odczytu
if (!plik_json.good()) //sprawdzanie czy plik istnieje
{
cout << "Nie udalo sie otworzyc pliku";
return 1;
}
cout << "Podaj sciezke do klucza: ";
getline(cin, sciezka); //wczytywanie sciezki z klawiatury (calej linii wlacznie ze spacjami)
size_t pozycja[100];
pozycja[0] = 0;
int ilosc_pozycji = 0;
for (int i = 1; i < 10; i++) //zapisywanie do tablicy pozycji spacji w stringu z kluczami
{
pozycja[i] = sciezka.find(spacja, pozycja[i-1]+1, 1);
ilosc_pozycji++;
if (sciezka.find(spacja, pozycja[i - 1] + 1, 1) == string::npos)
{
break;
}
}
for (int i = 1; i < ilosc_pozycji; i++) //wypisanie pozycji spacji
{
cout << pozycja[i] << endl;
}
tab[0] = sciezka.substr(0, pozycja[1]); //wpisanie kluczy do tablicy kluczy
for (int i = 1; i < ilosc_pozycji; i++)
{
tab[i] = sciezka.substr(pozycja[i]+1, pozycja[i + 1] - pozycja[i]);
}
for (int i = 0; i < ilosc_pozycji; i++) //wypisanie kluczy na ekran
{
cout << tab[i] << endl;
}
for (int i = 0; i < ilosc_pozycji; i++) //sedno programu (wyszukiwanie z pliku za pomoca kluczy)
{
}
plik_json.close();
return 0;
}