2011-09-16 39 views
1

我必須映射容器:與更新地圖有問題

map<string, char *> mOServs; 

map<LPWCH, int> mymap; 

我做了sqlite3的查詢,並嘗試的結果更新這兩個地圖:

sprintf_s(query,1024,"SELECT oservname FROM OServs;"); 
rc = sqlite3_get_table(db, query, &results, &nrow, &ncol, &zErrMsg); 
    cout << "query: " << query << endl; 
    if (rc != SQLITE_OK) { 
     fprintf(stderr, "Error Selecting oserv name: %s\n", zErrMsg); 
     sqlite3_free_table(results); 
     sqlite3_close(db); 
     return -1; 
    } 

int X = 0; 
WCHAR somevar[1024]; 

while(X < nrow) 
{ 
    mbstowcs(somevar, results[X+1], 1024); 
    wcstombs(output, somevar, 1024); 
    mOServs[output] = "offline"; 
    mymap[somevar] = X; 
    X++; 

} 

不知怎的mOServs似乎填充正確,但是使用mymap,它只包含循環結尾處查詢的最後一條記錄。難道我做錯了什麼?

我試圖將所有的查詢結果存儲在一張地圖中,這樣我就可以執行一個mymap.find(LPWCH)來查找表中是否有記錄。

+0

檢查每個循環迭代的輸出值。只要它一樣,地圖將與相同的密鑰相關聯。 – Mahesh

+1

'LPWCH'只是一個指針,並且您一次又一次地使用相同的指針,所以地圖中只有一個條目。 –

回答

1

也許你的意思做更多的東西是這樣的:

map<int, std::wstring> mymap; 
for(int i(0); i < nrow; ++i) 
{ 
// ... 
    mymap[i] = somevar; 
} 

編輯:其實你爲什麼在這裏需要一個地圖呢? std::vector可能就足夠了,將映射的設置爲臨時循環計數值沒有多大意義。

編輯#2:其實我剛剛意識到其他瘋狂的事情正在發生。首先,您從char*轉換爲wchar_t*,然後在下一行將其從wchar_t*轉換回char*

mbstowcs(somevar, results[X+1], 1024); 
wcstombs(output, somevar, 1024); 

這是不必要的。決定是否要使用std::stringstd::wstring並偏好這些對象。混合和匹配字符數組,指針指向數組,指向數組指針的類型定義,字符串對象以及混合寬字符和多字節字符只是要求麻煩。