2015-04-01 74 views
0

我通常使用Java進行編程。我只有C++的基本知識。我目前使用JNI來調用Windows API GetPrivateProfileSection()。如何獲取從GetPrivateProfileSection()返回的單個字符串

據我所知,我必須編寫一個C++函數來執行此操作。我很熟悉如何做到這一點。我面對的問題是GetPrivateProfileSection()返回的C++字符串。

從Microsoft文檔中,我明白返回的字符串包含每個由NULL字符分隔的name = value對。姓氏=值對以2個空字符結尾。

我想要做的是收集所有單個名稱=值字符串,並將它們放入一個數組中。我完全不知道如何使用GetPrivateProfileSection()返回的字符串來完成此操作。我聽說我需要做一些所謂的指針算術,但我不知道如何做到這一點。

任何人都可以幫我嗎?謝謝!

回答

0

讀取INI文件到std ::地圖的代碼看起來是這樣的:

LPTSTR str_settings = new TCHAR[bufferSize]; 

::GetPrivateProfileSection(_T("MySection"), str_settings , bufferSize, _T("MyIni.ini")); 

std::map<std::string, std::string> settings; // map key -> value from ini file 
std::string sett_string; 

for (;*str_settings; str_settings += sett_string.length() + 1) 
{ 
    sett_string = str_settings; 

    size_t pos = sett_string.find('='); 
    std::string key; 
    std::string value; 

    if (pos == std::string::npos) 
    { 
     key = sett_string; 
    } 
    else 
    { 
     key.assign(sett_string.begin(), sett_string.begin() + pos); 
     value.assign(sett_string.begin() + pos + 1, sett_string.end()); 
    } 

    settings[key] = value; 
} 
0

感謝您的答覆。我在一個測試C++程序中對您的源代碼進行了實驗,並且運行良好。我注意到的一件事是std :: map類與Java Properties類非常相似。

我現在的目標是獲取每個名稱=值對,並將它們連接在C++字符串中,每個名稱=值對由\ r \ n分隔。

經歷過了一段時間後,我終於用下面的代碼上來,這似乎工作:

void DoTest() 
{ 
const int bufferSize = 1024; 
LPTSTR str_settings = new TCHAR[bufferSize]; 
// Keep the original pointer. Need to delete later. 
LPTSTR str_settings_original = str_settings; 
// Another string to keep all name=value pairs back to back separated by \r\n. 
LPTSTR str_settings_concatenated = new TCHAR[bufferSize]; 

// I keep getting crash until I tried the following : 
// put a NULL character at the beginning of str_settings_concatenated. 
str_settings_concatenated[0] = NULL; 

::GetPrivateProfileSection(_T("MySection"), str_settings , bufferSize, _T("MyIni.ini")); 

std::string sett_string; 

for (;*str_settings; str_settings += sett_string.length() + 1) 
{ 
sett_string = str_settings; 
// str_settings effectively points to the next name=value pair 
// and this is what I really want. I take advantage of this 
// and pack them back-to-back into str_settings_concatenated 
// separated by \r\n. 
strcat(str_settings_concatenated, str_settings); 
strcat(str_settings_concatenated, "\r\n"); 
} 

delete str_settings_original; 
str_settings_original = NULL; 

delete str_settings_concatenated; 
str_settings_concatenated = NULL; 
} 

要點:

  • 我用你的循環結構,以獲得每個名稱=值對在str_settings中。
  • 在for循環的每次迭代中,str_settings似乎總是得到下一個名稱=值對,這對我來說很好,即使我真的不知道代碼是如何工作的(但非常感謝你)。
  • 我創建了另一個C++字符串來存儲每個由\ r \ n分隔的每個名稱=值對。我用strcat()來做到這一點。
  • 我最初得到了很多崩潰,str_settings_concatenated似乎沒有得到任何字符串。
  • 我還記得,在C++中,我們必須使用new調用每個內存分配的刪除。我試過這個,但沒有幫助。然而,我從一位朋友那裏得到了一些建議,告訴我我應該在str_settings_concatenated的開頭加上一個NULL字符。

該代碼現在運行良好。如果您不介意,您是否也可以指出代碼中存在的其他錯誤?

再一次,非常感謝您的幫助。

David。

問題:抱歉使用答案選項發佈此。由於字符限制,無法將其作爲評論發佈。