【发布时间】:2022-06-30 06:51:04
【问题描述】:
我需要从多个 JSON 文件中读取数据。数据的实际读取是在代码中稍后执行的,在一些初始化的东西之后。由于超出此问题范围的原因,我相信我的应用程序将一个迭代器存储在某个地方是有益的,该迭代器设置为每个 JSON 文件的第一个元素。这样,我就可以在以后遍历每个 JSON 文件并从每个文件中读取第 i 个元素。
问题:如果我创建迭代器并使用它立即解析数据,一切正常。 如果我创建迭代器,将其存储在结构中并稍后使用,我会遇到读取访问冲突。
以下是一些代码,可以更好地解释我的问题。首先,这里是包含单个 JSON 文件信息的结构的部分声明:
typedef struct _struct
{
...
boost::property_tree::ptree json_struct;
boost::property_tree::ptree::iterator it;
...
} json_handler;
仅供参考,稍后,我声明一个用于容纳多个处理程序的容器:
std::map<std::string, json_handler> mjh;
以下作品:
json_handler cms;
boost::property_tree::read_json(full_path, cms.json_struct);
boost::property_tree::ptree &data = cms.json_struct.get_child("frames");
// current_msg.it = data.begin();
// If I do iterate over the json content here, everything works.
for (boost::property_tree::ptree::iterator element = data.begin(); element != data.end(); element++)
double time = element->second.get<double>("ST");
// The following line just inserts the current json_handler inside the map
mjh.insert(std::pair<std::string,json_handler>(name, cms));
以下操作无效:
... This is later in the code when it's time to use the data
std::map<std::string, json_handler>::iterator it;
for (it = mjh.begin(); it != mjh.end(); it++)
{
double _st = it->second.it->second.get<double>("ST");
std::cout << "ST: " << std::to_string(_st ) << std::endl;
...
}
问题:我可以将迭代器存储在结构中吗?如果不是,为什么?
【问题讨论】:
-
我猜一些保存迭代器的变量已经被破坏或者“文件流”不再打开。因此迭代器无效
-
您可以将迭代器存储在结构中。您可以使用任何迭代器,直到它失效为止。
-
当您在地图中插入
cms时,它就是一个副本。原始的(您的迭代器指向的那个)大概在超出范围后被销毁。我只能猜测,因为您确实没有显示足够的代码。 -
@paddy 我相信你是对的。我已经完成了一些调试会话,确实,我可以说你是对的。现在,我只需要想办法解决它……
-
嗯,第二个问题是您甚至没有首先存储迭代器......无论如何,不在您显示的代码中。所以这也可能是一个问题。至于复制问题,您可以先添加到地图中,然后获取对存储在地图中的对象的引用,以便填充它:例如
auto result = mjh.emplace(name, {}); json_handler& cms = result.first->second;