2015-04-01 71 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。

问题:抱歉使用答案选项发布此。由于字符限制,无法将其作为评论发布。