如何获取从GetPrivateProfileSection()返回的单个字符串
How to obtain individual strings returned from GetPrivateProfileSection()
我通常使用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字符
代码现在运行良好。如果你不介意,你能指出代码中存在的任何其他错误吗?
再次感谢您的帮助。
大卫。
附言:很抱歉使用"回答"选项发布此消息。由于字符限制,无法将其作为评论发布。
相关文章:
- 如何使用单个返回语句返回对变量的引用
- 返回向量的单个索引值
- USB-HID 读/写(重叠)等待单个对象不返回C++
- 可能从单个方法返回不同类型的对象
- DropDownList 组合上的 SendDlgItemMessage CB_GETLBTEXT 返回单个字母
- WM_GETTEXT只返回单个字符
- 初学者C++:返回单个值。问题:我的金额四舍五入,我不希望它四舍五入
- 函数在另一个函数中调用时返回 false,而单个返回类型为 true
- 如何获取从GetPrivateProfileSection()返回的单个字符串
- 盈透证券为单个订单返回多个"presubmitted"订单状态
- 从单个函数返回多个变量
- C++ 从链表中返回单个值
- 返回不同类型变量的单个 get 方法
- 如何使操作符[]返回对unsigned int中单个位的引用
- 存储多个类型并根据请求返回单个类型
- vector上的For循环,总是返回单个索引
- ADODB/C++:"执行"返回单个值时返回什么?
- 从文件中读取单个字符将返回特殊字符
- 返回单个字符字面值作为指针
- C++套接字 - 从结构数组返回单个地址信息