2009-10-08 75 views
0

我想讀取單詞列表並將它們保存在C++ STL hash_map以及它們在按字母順序排序的文件中的位置。這個想法後來我需要能夠判斷一個字符串是否是一個單詞,以及它是在一個單詞之前還是之後出現。C++讀取文件到hash_map

ifstream f_dict ("dictionary.txt"); 
__gnu_cxx::hash_map <const char*, int> dictionary; 
string temp_str; 
int counter = 0; 
while (!f_dict.eof()) { 
    f_dict >> temp_str; 
    dictionary.insert(make_pair(temp_str.c_str(), counter++)); 
} 

我遇到的問題是它沒有保存實際的單詞。下面的for loop列出了所選單詞,但iter->first始終爲空。我錯過了什麼?

__gnu_cxx::hash_map<const char*, int>::iterator iter; 
int i = 0; 
for (iter = dictionary.begin(); iter != dictionary.end() && i < 150; iter++) { 
    cout << "word: " << iter->first << " index: " << iter->second << "\n"; 
    i++; 
} 

回答

3

您試圖爲每個單詞存儲相同的const char *,因爲您從不爲從文件中拉出的單詞創建任何新的內存。如果您打印出從temp_str.c_str()返回的指針,則對於第一個循環中的每個調用都將是相同的。在你的第二個循環中,你爲地圖中的每個記錄打印出相同的char *(注意,只有1個b/c地圖不允許dups),它已經被設置爲空字符串,或者在第一個循環內,或者在第你的循環。

下面是演示問題和解決方案的示例代碼。

#include <fstream> 
#include <iostream> 
#include <map> 

using namespace std; 

int main (int argc, char **argv) 
{ 
    ifstream file("test.txt"); 
    map<const char *, int> dictionary; 
    map<string, int>  strDictionary; 

    string temp_str; 
    int counter = 0; 
    while (!file.eof()) 
    { 
     file >> temp_str; 
     cout << "PARSED: " << temp_str << "\n"; 
     cout << "INSERTING: " << (unsigned long) temp_str.c_str() << "\n"; 
     dictionary.insert(make_pair(temp_str.c_str(), counter)); 
     strDictionary.insert(make_pair(temp_str, counter)); 
     counter++; 
    } 

    cout << "Dictionary Size: " << dictionary.size() << "\n"; 
    cout << "Str Dictionary Size: " << strDictionary.size() << "\n"; 

    for (map<const char*, int>::const_iterator iter = dictionary.begin(); 
     iter != dictionary.end(); 
     ++iter) 
    { 
     cout << "CHAR * DICTINARY: " << iter->first << " -> " << iter->second << "\n"; 
    } 

    for (map<string, int>::const_iterator iter = strDictionary.begin(); 
     iter != strDictionary.end(); 
     ++iter) 
    { 
     cout << "STR DICTIONARY: " << iter->first << " -> " << iter->second << "\n"; 
    } 
    return 1; 
} 
0

你想使用std ::字符串作爲密鑰類型,而不是爲const char *,否則該字符串不會被複制,你會在每個插入相同的鍵結束。