Динамическое создание и хранение данных в строковом массиве
Я использую библиотеку libconfig C++ для получения хранимых данных, и мне нужно хранить эти данные в строковом массиве в C++, не зная количества переменных, которые будут переданы через файл конфигурации. Я знаю, что это на самом деле невозможно в C++, но я пытаюсь найти лучшую практику для этого, и другие решения, кажется, не имеют практического смысла для того, что я делаю. Ниже приведена часть кода, где я пытаюсь взять строковый тип файла и сохранить все результаты по отдельности в строковом массиве.
try {
for (int i = 0; i < cfg.getRoot()["files"].getLength(); ++i) {
// Only output the record if all of the expected fields are present.
string filetype;
if (!(cfg.getRoot()["files"][i].lookupValue("filetype", filetype)))
continue;
cout << filetype << endl;
}
}
catch (const SettingNotFoundException &nfex) {
// Ignore.
}
Извиняюсь за вероятный лицевой импульс, который у вас есть сейчас, я студент колледжа, все еще изучающий веревки, и в настоящее время я работаю над своим курсом над личным проектом.
1 ответ
Я считаю, что ваш код может работать так, как вам нужно, с минимальными изменениями. Все, что вам нужно, это std::vector<std::string>
чтобы содержать все поля, которые вы записываете из вашего цикла:
std::vector<std::string> filetypes;
try {
for (int i = 0; i < cfg.getRoot()["files"].getLength(); ++i) {
// Only output the record if all of the expected fields are present.
std::string filetype;
if (!(cfg.getRoot()["files"][i].lookupValue("filetype", filetype)))
continue;
//The use of std::move is optional, it only helps improve performance.
//Code will be logically correct if you omit it.
filetypes.emplace_back(std::move(filetype));
}
}
catch (const SettingNotFoundException &nfex) {
// Ignore.
}
//Proof that all values have been properly stored.
for(std::string const& filetype : filetypes) {
std::cout << filetype << std::endl;
}
Я не знаю, какой тип возврата на cfg.getRoot()["files"]
есть, но может быть целесообразно сохранить этот объект для улучшения читабельности вашего кода:
std::vector<std::string> filetypes;
try {
//One of these is correct for your code; I don't know which.
//auto & files = cfg.getRoot()["files"];
//auto const& files = cfg.getRoot()["files"];
//I'm assuming this is correct
auto files = cfg.getRoot()["files"];
for (auto const& entry : files) {
// Only output the record if all of the expected fields are present.
std::string filetype;
if (!(entry.lookupValue("filetype", filetype)))
continue;
//The use of std::move is optional, it only helps improve performance.
//Code will be logically correct if you omit it.
filetypes.emplace_back(std::move(filetype));
}
}
catch (const SettingNotFoundException &nfex) {
// Ignore.
}
//Proof that all values have been properly stored.
for(std::string const& filetype : filetypes) {
std::cout << filetype << std::endl;
}