Итак, я пытаюсь создать таблицу символов из входного файла, который содержит вложенные блоки C-стиля, подобные этому в 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>
I'v пытался так много всего. Используя векторы, карты и теперь, наконец, я решил использовать multimaps. Независимо от того, что я делаю, я прихожу к одной и той же проблеме, поэтому она, вероятно, не имеет никакого отношения к структуре данных, которую я выбираю.
Проблема в том, что, поскольку я читаю строки за строкой, я получаю больше, чем нужно. Но если у меня не будет его/iterate мультиплексов в цикле for для каждой строки, я бы повторил их после того, как они были стерты/вытолкнуты. Я не уверен, что делать с логической логикой, чтобы выводить вывод на экран так, как надо, или если я даже на правильном пути.
Вот мой файл .cpp. Игнорируйте комментарии, поскольку они были прошлыми попытками, которые я отказался использовать на данный момент. Также в этой версии я не использую векторы, поэтому вы можете игнорировать векторный код. Я "м только с помощью multimaps Теперь.
#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
}
}
Хотя вы можете решить его только с помощью стандартных контейнеров, это будет очень сложно и сложно. Вместо этого нужен некоторый тип контейнера для сбора нескольких атрибутов в одну * структуру *. –
Разве это не то, что я делаю? – Nonlin
Вам нужна sg, как map>>, потому что вы хотите сопоставить для каждой заглавной (blockname) сопоставление переменных. Но реализовать его таким образом будет немного сложнее, чем мой код. Я делаю то же, что и вы, в моем ответе. Но вместо создания типов монстров я структурировал данные. –
ch0kee