丢弃来自进程内存的读取文本块的已解析行

时间:2016-04-14 21:53:20

标签: c++ memory

这是我用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>

我怎么能丢弃已经解析过的字符串?比较时间戳似乎不是一个选项,因为它们甚至不包括秒。

1 个答案:

答案 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;的值。

另外,你说,

  

我怎么能丢弃已经解析过的字符串?比较时间戳似乎不是一个选项,因为它们甚至不包括秒。

这取决于你如何存储字符串,但我认为它需要成为解析例程的一部分。