2012-07-17 26 views
0

值我正在讀.dat文件的內容,並填入一unordered_map是這樣的:檢索的unordered_map

bool FileManager::LoadSkillList(LPCSTR name) 
{ 
    int counter = 0; 
    std::ifstream myFile(name, std::ios::binary | std::ios::out); 
    if(myFile.fail()) 
    { 
     myFile.close(); 
     return false; 
    } 
    char skill[0x12C]; 
    ZeroMemory(skill,0x12C); 
    char buff[100]; 
    while(counter != TOTAL_SKILLS) 
    { 
     myFile.read(skill,0x12C); 

     if(myFile.gcount() < 1) continue; 

     auto skillBlock = (SkillInfo*)&skill; 

#ifdef _DEBUG 
     char* skillName = skillBlock->szSkillName; 
     int delay = skillBlock->delayTime; 

     wsprintf(buff,"Skill Name: %s - Delay: %d\r\n",skillName,delay); 
     Log(buff); 
#endif 

     this->skills.insert(std::make_pair(counter,skillBlock)); 

     if(myFile.gcount() > 0) counter++; 
     myFile.seekg(counter * 0x12C); 
    } 
#ifdef _DEBUG 
    Log("Skill count: %d\r\n",(int)this->skills.size()); 
#endif 
    myFile.close(); 

    return (counter>0)?true:false; 
} 

當我嘗試找回LoadSkillList方法中的映射值,它工作正常。但是我在FileManager類中有另一個方法,可以通過其他類訪問,以便檢索unordered_map值。

for(int skillNumber = 0; skillNumber < TOTAL_SKILLS; skillNumber++) 
{ 
    auto fileDelay = fManager->getDelay(skillNumber); 
} 
// ... 

int FileManager::getDelay(int n) 
{ 
    auto block = this->skills.at(n); 
    return block->delayTime; 
} 

但不知何故,我的應用程序在該方法內崩潰。 (我正在構建一個dll,並且使用調試器對其進行了檢查。)

發生了什麼事情的任何線索?已經嘗試過std::array, std::map沒有成功,都在同一個方法上崩潰。

+0

你能否濃縮成一個**最小的,完整的,自成體系**的例子嗎? – 2012-07-17 16:53:04

+1

你得到的例外是什麼? '.at()'可以拋出一個超出範圍的異常,例如,如果'n'是一個無效的索引... – AJG85 2012-07-17 16:54:56

+0

我添加了一個'try/catch',但它甚至沒有被觸發,應用程序崩潰了第一個 – 2012-07-17 17:05:55

回答

0

我解決我的問題這樣做:

聲明skills爲靜態。 增加值的unordered_map這樣的:

 FileManager::skills.insert(std::make_pair(counter, new SkillInfo())); 
    memcpy(this->skills[counter],skillBlock,sizeof(SkillInfo)); 

檢索這樣所需的值:

int FileManager::getDelay(int n) 
{ 
auto block = FileManager::skills[n]; 
return block->delayTime; 
} 
+1

memcpy不是用C++初始化類的一種方法。試試這個:'FileManager :: skills.insert(std :: make_pair(counter,new SkillInfo(skillBlock)));' – Dani 2012-07-17 18:40:26