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

时间:2015-04-01 16:03:11

标签: java c++ java-native-interface

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

我知道我必须编写一个C ++函数来执行此操作。我模糊地熟悉如何做到这一点。我遇到的问题是从GetPrivateProfileSection()返回的C ++字符串。

从Microsoft文档中,我了解返回的字符串包含name = value对,每个都由NULL字符分隔。姓氏=值对以2个NULL字符结尾。

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

有人可以帮帮我吗?谢谢!

2 个答案:

答案 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;
}

重点:

  • 我使用你的for循环结构来获取str_settings中的每个name = value对。
  • 在for循环的每次迭代中,str_settings似乎总是获得下一个name = value对,这对我很有用,尽管我真的不知道代码是如何工作的(但很多,谢谢你)。
  • 我创建了另一个C ++字符串来存储每个名称=值对,每个名称=值对用\ r \ n分隔。我用strcat()来做这件事。
  • 我最初遇到很多崩溃,并且str_settings_concatenated似乎没有得到任何字符串。
  • 我还记得在C ++中我们必须使用new来调用每个内存分配的删除。我试过这个并没有帮助。但是,我得到了一位朋友的建议,告诉我我应该在str_settings_concatenated的开头添加一个NULL字符。

现在代码效果很好。如果你不介意,你还能指出代码中出现的任何其他错误吗?

再一次,非常感谢你的帮助。

大卫。

P.S。:抱歉使用“接听”选项发布此内容。由于字符限制,无法将此作为评论发布。