2016-04-14 58 views
0

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

我不認爲你的代碼是否有足夠的周圍的電話,來電等能夠正確回答問題。我想說的是做一些事情,比如make'msg_node_addr'靜態或者在'reader'中放一個'last_accessed_addr',但是我對其餘的代碼或者設計知之甚少。 – user2475059

+0

@ user2475059'reader'只是一個圍繞WinAPI調用的包裝類。我想在最後一次通話中標出我「起飛」的信息,並在下一次通話中從那一時刻開始。 – adrift

+0

同樣,我對代碼的結構還不夠熟悉,但我認爲我會採取的方法是隻是以某種方式存儲'last_accessed_addr',然後只返回所有內容。即使如此,有很多方法可以做* *(靜態函數範圍變量,類成員變量,某種返回值跟蹤,將該字符串與其在進程中的地址捆綁在一起並使用輔助函數進行計算),所以沒有其他代碼來了解哪種方式可能是最好的,我卡在這裏。 – user2475059

回答

0

您可以嘗試創建一個變量static auto last_msg_node_addr = msg_node_address;之前您最初進入while循環和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);在循環的地方行last_msg_node_addr = msg_node_addr;年底前。由於變量是靜態的,它應該在函數調用之間保持它的值。您只需修改該功能即可在進入該功能並更新之前檢查last_msg_ptr的值。

另外,您說,

我怎麼能放棄已經被解析字符串?比較時間戳似乎不是一種選擇,因爲它們甚至不包括秒。

這取決於你如何存儲字符串,但我認爲它需要成爲你的解析程序的一部分。

+0

你們兩個都有正確的想法,我完全忘了靜態變量的存在,謝謝! – adrift

+0

如果這是在一個線程環境中進行的(顯然至少是一個多進程環境),那麼請注意圍繞靜態變量的線程問題。至少,我*認爲*這是有問題的;我不多做多線程。 – user2475059