我要在C ++中读取和解析ini文件中的一部分
我试图在GetPrivateProfileString的帮助下阅读它,但它最多读取到“ $ THIS $ = somevalue”,\并且不再进一步阅读。
file.ini
[Mysection]
UserDefinedVariables="$THIS$=somevalue",\
"$THAT$=somevalue1",\
"$DEVICE1$=somevalue2",\
"$DEVICE2$=somevalue3",\
"$DEVICE3$=somevalue4"
c ++文件
wchar_t deviceName[200];
GetPrivateProfileString(L"Mysection", L"UserDefinedVariables", NULL, deviceName, sizeof(deviceName), file.ini);
在这里,我特别感兴趣与$ DEVICE1 $相对应的值,即somevalue2。 有什么办法可以利用Windows API来读取它吗?
答案 0 :(得分:0)
是的。您可以使用此功能。但我怀疑这是您想要做的。
问题在于您的输入文件错误。末尾的\通常是行的连接器。因此,所有文本都应该在一行中。然后应该解析结果。
下一行再次被视为具有值的键。
但是密钥不是您所期望的$ DEVICE1 $,而是“ $ DEVICE1 $。请参阅附加内容”。请阅读功能docu。
如果您搜索该键,则会得到结果。但是这里再次附加了“。
所以以下几行的格式不正确,原因是我之前解释过的。要查看此功能的工作方式(首先不要使用),请参见以下代码:
#include <Windows.h>
#include <iostream>
int main()
{
wchar_t deviceName[400];
GetPrivateProfileString(L"Mysection", L"UserDefinedVariables", NULL, deviceName, sizeof(deviceName), L"r:\\file.ini");
std::wcout << "searching for key UserDefinedVariables --> " << deviceName << '\n';
// Get all keys
std::wcout << "\n\nSearching for all keys in section:\n";
DWORD size = GetPrivateProfileString(L"Mysection", NULL, NULL, deviceName, sizeof(deviceName), L"r:\\file.ini");
DWORD start = 0;
wchar_t keys[10][100];
DWORD keyIndex = 0;
for (DWORD i = 0; i < size; ++i) {
if (deviceName[i] == 0) {
#pragma warning(suppress : 4996)
wcscpy(keys[keyIndex], deviceName + start);
start = i + 1;
std::wcout << keys[keyIndex] << '\n';
++keyIndex;
}
}
// Getting all values for the keys
std::wcout << "\n\nSearching for all keys with values in section:\n";
for (DWORD i = 0; i < keyIndex; ++i) {
GetPrivateProfileString(L"Mysection", keys[i], NULL, deviceName, sizeof(deviceName), L"r:\\file.ini");
std::wcout << keys[i] << " --> " << deviceName << '\n';
}
return 0;
}
结果:
searching for key UserDefinedVariables --> "$THIS$=somevalue",\
Searching for all keys in section:
UserDefinedVariables
"$THAT$
"$DEVICE1$
"$DEVICE2$
"$DEVICE3$
Searching for all keys with values in section:
UserDefinedVariables --> "$THIS$=somevalue",\
"$THAT$ --> somevalue1",\
"$DEVICE1$ --> somevalue2",\
"$DEVICE2$ --> somevalue3",\
"$DEVICE3$ --> somevalue4"
然后您可以根据需要提取值。
但是正如我所说。最好更正ini文件。