如何获取从GetPrivateProfileSection()返回的单个字符串

How to obtain individual strings returned from GetPrivateProfileSection()

本文关键字:返回 单个 字符串 GetPrivateProfileSection 获取 何获取      更新时间:2023-10-16

我通常使用Java进行编程。我只有C++的基本知识。我目前正在使用JNI调用Windows API GetPrivateProfileSection()。

我知道我必须编写一个C++函数才能做到这一点。我对如何做到这一点有点熟悉。我面临的问题是从GetPrivateProfileSection()返回的C++字符串。

从Microsoft文档中,我了解到返回的字符串包含名称=值对,每个值对由NULL字符分隔。最后一个名称=值对以2个NULL字符结尾。

我想做的是收集所有单独的name=value字符串,并将它们放在一个数组中。我完全不知道如何使用GetPrivateProfileSection()返回的字符串来执行此操作。我听说我需要做一些被称为指针算术的东西,但我不知道如何做到这一点。

有人能帮我吗?谢谢

将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;
}

感谢您的回复。我在一个测试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 rn.
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 rn.
strcat(str_settings_concatenated, str_settings);
strcat(str_settings_concatenated, "rn");
}
delete str_settings_original;
str_settings_original = NULL;
delete str_settings_concatenated;
str_settings_concatenated = NULL;
}

要点:

  • 我使用for循环构造来获得str_settings中的每个名称=值对
  • 在for循环的每一次迭代中,str_settings似乎总是得到下一个name=value对,这对我来说很好,尽管我真的不知道代码是如何工作的(但非常感谢你)
  • 我创建了另一个C++字符串来存储每个名称=值对,每个值对由一个\r\n分隔。我用strcat()来做这个
  • 最初我遇到了很多崩溃,str_settings_concatenated似乎没有得到任何字符串
  • 我还记得,在C++中,我们必须使用new对每个内存分配调用delete。我试过了,但没用。然而,我从一位朋友那里得到了一些建议,他告诉我应该在str_settings_concatenated的开头放一个NULL字符

代码现在运行良好。如果你不介意,你能指出代码中存在的任何其他错误吗?

再次感谢您的帮助。

大卫。

附言:很抱歉使用"回答"选项发布此消息。由于字符限制,无法将其作为评论发布。