这是我用C ++编写的第一个更大的东西,我无法完全理解我偶然发现的问题。我正在使用以下代码段从进程内存中读取字符串:
auto entries = std::vector<std::string>();
auto msg_node_addr = reader.readPtr(tab_msg_data_struct +
DATA_STRUCT_NODE_OFFSET);
/*
* Loop through message nodes,
* and retrieve information at given offset.
*/
while (msg_node_addr != 0x0) {
auto msg_content_ptr = reader.readPtr(msg_node_addr +
NODE_CONTENT_PTR_OFFSET);
auto msg_content = reader.readStr(msg_content_ptr, 255);
auto has_timestamp = !msg_content.empty()
&& std::isdigit(msg_content[0])
&& std::isdigit(msg_content[1])
&& msg_content[2] == ':';
if (has_timestamp) {
entries.emplace_back(msg_content);
}
// Advance to next node.
msg_node_addr = reader.readPtr(msg_node_addr +
DATA_STRUCT_NODE_STEP_OFFSET);
}
驻留在返回条目向量的函数中。 每个条目都具有以下形式:
12:31 Loot of a <creature>: <loot>
我调用该函数,获取当前的消息块,并从中检索所需的值。现在,当我再次称呼它时,总会有一些我已经注意过的值和新的值。
例如,这将是第一次调用后的结果:
15:30 Loot of a <creature>: <loot>
15:30 Loot of a <creature>: <loot>
15:31 Loot of a <creature>: <loot>
这是在第二个之后:
15:30 Loot of a <creature>: <loot> <- Old value.
15:30 Loot of a <creature>: <loot> <- Old value.
15:31 Loot of a <creature>: <loot> <- Old value.
15:31 Loot of a <creature>: <loot> <- New one.
15:32 Loot of a <creature>: <loot>
我怎么能丢弃已经解析过的字符串?比较时间戳似乎不是一个选项,因为它们甚至不包括秒。
答案 0 :(得分:0)
您可以尝试在最初输入while循环之前和static auto last_msg_node_addr = msg_node_address;
语句之后创建变量auto msg_node_addr = reader.readPtr(tab_msg_data_struct + DATA_STRUCT_NODE_OFFSET);
,然后在循环结束时msg_node_addr = reader.readPtr(msg_node_addr + DATA_STRUCT_NODE_STEP_OFFSET);
之前放置行{{ 1}}。由于变量是静态的,因此它应该在函数调用之间保持其值。您只需要在进入函数时以及更新函数之前修改函数以检查last_msg_node_addr = msg_node_addr;
的值。
另外,你说,
我怎么能丢弃已经解析过的字符串?比较时间戳似乎不是一个选项,因为它们甚至不包括秒。
这取决于你如何存储字符串,但我认为它需要成为解析例程的一部分。