У меня проблема с моей текущей задачей. В принципе, мне предоставлен XML-файл и я пытаюсь разобрать его для получения ключевой информации. Например, некоторые строки будет выглядеть следующим образом:Определить переменные-члены в функциях вслепую
<IPAddress>123.45.67</IPAddress>
И я, чтобы получить значение 123.45.67, ничего слишком плохо. Мне сказали не использовать XML-парсер и просто разобрать его вручную, что было довольно легко. Однако у меня возникают проблемы со второй частью задачи. В принципе, я должен создать класс с определенными переменными-членами и объявить их на основе значений, которые я анализирую. Итак, скажем, класс называется Something, и есть переменная-член, называемая IPAddress. Я должен обновить значение IPAddress до 123.45.67, поэтому, когда кто-то вызывает Something.IPAddress в основном методе, он возвращает 123.45.67. Это была моя первая попытка на него:
#include <iostream>
#include <fstream>
#include <string>
#include <sys/stat.h>
using namespace std;
class Something
{
public:
string location;
string IPAddress;
string theName;
int aValue;
//loop through the array from the method below
void fillContent(string* array)
{
for(int i = 0; i < array->size(); i++)
{
string line = array[i];
if((line.find("<") != std::string::npos) && (line.find(">")!= std::string::npos))
{
unsigned first = line.find("<");
unsigned last = line.find(">");
string strNew = line.substr (first + 1, last - first - 1); //this line will get the key, in this case, "IPAddress"
unsigned newfirst = line.find(">");
unsigned newlast = line.find_last_of("<");
string strNew2 = line.substr(newfirst + 1, newlast - newfirst - 1); //this line will get the value, in this case, "123.45.67"
if(strNew == "IPAddress")
{
IPAddress = strNew2; //set the member variable to the IP Address
}
}
}
}
//this method will create an array where each element is a line from the xml
void fillVariables()
{
string line;
ifstream myfile ("content.xml");
long num = //function that gets size that I didn't add to make code shorter!;
string *myArray;
myArray = new string[num];
string str1 = "";
string strNew2 = "";
int counter = 0;
if (myfile.is_open())
{
while (getline (myfile,line))
{
myArray[counter] = line;
counter++;
}
myfile.close();
}
fillContent(myArray);
}
};
int main(int argc, char* argv[])
{
Something local;
local.fillVariables();
cout << local.IPAddress<< endl; // should return "123.45.67"
return 0;
}
Теперь это делать то, что я хочу, чтобы это сделать, однако, вы можете видеть, что я нужен, если заявление. Предполагая, что у меня есть по крайней мере 20 из этих переменных-членов, наличие 20 if-утверждений будет раздражать и просто нахмуриться. Можно ли каким-либо образом получить доступ к переменным-членам из класса? Извините, если мой вопрос был долгим, я просто хотел убедиться, что все, что необходимо для понимания вопроса, предоставляется! Пожалуйста, дайте мне знать, если что-то важное, что может не быть, должно быть добавлено.
Большое спасибо!
Так бы я добавить 'зЬй :: Карта <строка, строка *> varmap { { "IPAddress", & IPAddress}, {"AnotherField", & AnotherField} }; 'на самом верху и просто добавить все переменные-члены на эту карту? Или это будет вставлено в функцию fillContent? Я вхожу в функцию, правильно? – user2397837
@ user2397837 В верхней части функции 'fillContent'. – refi64
Позвольте мне сделать снимок. Я дам вам знать, как все идет! Я думал использовать карты, но не использовал их в течение некоторого времени, так что немного не знаком с ними. – user2397837