我通常使用Java进行编程。我只掌握C ++的基础知识。我目前正在使用JNI来调用Windows API GetPrivateProfileSection()。
我知道我必须编写一个C ++函数来执行此操作。我模糊地熟悉如何做到这一点。我遇到的问题是从GetPrivateProfileSection()返回的C ++字符串。
从Microsoft文档中,我了解返回的字符串包含name = value对,每个都由NULL字符分隔。姓氏=值对以2个NULL字符结尾。
我想要做的是收集所有单独的name = value字符串并将它们放在一个数组中。我完全不知道如何使用GetPrivateProfileSection()返回的字符串执行此操作。我听说我需要做一些称为指针算术的东西,但我不知道该怎么做。
有人可以帮帮我吗?谢谢!
答案 0 :(得分:0)
将INI文件读取到std :: map的代码如下所示:
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;
}
答案 1 :(得分:0)
感谢您的回复。我在测试C ++程序中试验了你的源代码,它运行良好。我注意到的一件事是std :: map类与Java Properties类非常相似。
我现在的目标是获取每个name = value对并在C ++字符串中背靠背连接,每个name = value对用\ 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;
}
重点:
现在代码效果很好。如果你不介意,你还能指出代码中出现的任何其他错误吗?
再一次,非常感谢你的帮助。
大卫。
P.S。:抱歉使用“接听”选项发布此内容。由于字符限制,无法将此作为评论发布。