Итак, я пытаюсь создать таблицу символов из входного файла, который содержит вложенные блоки в стиле C, подобные этому в C++;
A: { int a; float b;
B: { float c; int d;
C: { int b; int c;
}
}
D: { float a;
}
}
Вывод должен выглядеть следующим образом.
A: a -> <int, A>
b -> <float, A>
B: a -> <int, A>
b -> <float, A>
c -> <float, B>
d -> <int, B>
C: a -> <int, A>
b -> <int, C> -> <float, A>
c -> <int C> -> <float, B>
d -> <int, local to B>
D: a -> <float D> -> <int, A>
b -> <float, A>
Я пробовал так много вещей. Использую векторы, карты и вот, наконец, решил использовать мультикарты. Что бы я ни делал, я сталкиваюсь с одной и той же проблемой, поэтому, вероятно, это не имеет ничего общего с выбранной мной структурой данных.
Проблема в том, что, поскольку я читаю построчно, я получаю больше, чем нужно. Но если у меня нет этого, cout/итерируйте мультикарты в цикле for для каждой строки, чем я буду выполнять итерацию после того, как они были стерты/вытолкнуты. Я не уверен, что делать с логикой, чтобы вывод отображался так, как должен, или если я даже на правильном пути.
Вот мой файл .cpp. Игнорируйте комментарии, так как они были прошлыми попытками, которые я отказался использовать на данный момент. Также в этой версии я не использую векторы, поэтому вы можете игнорировать код, связанный с векторами. Сейчас я просто использую мультикарты.
#include<iostream>
#include<fstream>
#include<string>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
void ReadFromFile();
void main(){
ReadFromFile();
cin.get();
}
void ReadFromFile(){
stringstream ss;
string type = "";
string var = "";
string lable = "";
string Obraket = "";
string Cbraket = "";
int braketCount = -1;
ifstream myfile("input1.txt");
multimap<string, string> symbol;
multimap<string, multimap<string, string>> symbolL;
if (myfile.is_open())
{
for (string line; getline(myfile, line);)
{
istringstream in(line);
if (in.str().find("}") == string::npos && in.str().find("{") != string::npos){
in >> lable;
in >> Obraket;
braketCount++;
cout << Obraket << endl;
in >> type;
in >> var;
symbol.insert(pair<string, string>(var.substr(0, 1), type));
if (in.str().find("float") != string::npos || in.str().find("int") != string::npos){
var = "";
type = "";
in >> type;
in >> var;
if (type.length() > 1){
symbol.insert(pair<string, string>(var.substr(0, 1), type));
}
}
symbolL.insert( pair<string, multimap<string, string>>(lable,symbol));
for (multimap<string, multimap<string, string>>::iterator it = symbolL.begin(); it != symbolL.end(); ++it){
cout << it->first;
for (multimap<string, string>::iterator it2 = symbol.begin(); it2 != symbol.end(); ++it2){
cout << it2->first << "-> " << "<" << it2->second << ">, " << it->first.substr(0, 1) << endl;
}
}
}
else if (in.str().find("}") != string::npos){
in >> Cbraket;
//braketCount--;
cout << Cbraket << endl;
symbolL.erase(prev(symbolL.end()));
//symbol.erase(prev(symbol.end()));
}
}
myfile.close();
}
else cout << "Unable to open file";
}
Это результат, который я получаю.
{
A:a-> <int>, A
b-> <float>, A
{
A:a-> <int>, A
b-> <float>, A
c-> <float>, A
d-> <int>, A
B:a-> <int>, B
b-> <float>, B
c-> <float>, B
d-> <int>, B
{
A:a-> <int>, A
b-> <float>, A
b-> <int>, A
c-> <float>, A
c-> <int>, A
d-> <int>, A
B:a-> <int>, B
b-> <float>, B
b-> <int>, B
c-> <float>, B
c-> <int>, B
d-> <int>, B
C:a-> <int>, C
b-> <float>, C
b-> <int>, C
c-> <float>, C
c-> <int>, C
d-> <int>, C
}
}
{
A:a-> <int>, A
a-> <float>, A
b-> <float>, A
b-> <int>, A
c-> <float>, A
c-> <int>, A
d-> <int>, A
D:a-> <int>, D
a-> <float>, D
b-> <float>, D
b-> <int>, D
c-> <float>, D
c-> <int>, D
d-> <int>, D
}
}