gpt4 book ai didi

c++使用GetPrivateProfileString读取配置文件参数

转载 作者:行者123 更新时间:2023-11-30 04:01:10 25 4
gpt4 key购买 nike

我有一个 C++ 中的 win32 控制台应用程序,Visual Studio 2012。我无法从 ini 文件中获取配置参数。我尝试了不同的文件路径可能性,比如将 .ini 文件放在源文件夹中,将完整路径写入 is,将其放在包含生成的 .exe 文件的文件夹中。在每种情况下,执行 .exe 文件后控制台上的输出都是 0 或 (null) for string。我做错了什么?如何读取参数?

v1:
LPCTSTR path = L".\\config.ini";
TCHAR protocolChar[32];
int port = GetPrivateProfileString(_T("PORT"), _T("SETTINGS"), _T(""), protocolChar, 32, path);
printf("***%d***\n", port);

v2:
int port = GetPrivateProfileInt(_T("PORT"), _T("SETTINGS"), 0, _T("config.ini"));

config.ini 包含:

[SETTINGS]
USER_NUM_MAX = 256 ; Maximum number of users
PORT = 8080;

最佳答案

哎呀,在 Windows 下打 ini 文件没那么容易。在这两种尝试(v1 和 v2)中,您在当前 目录中查找文件,然后在 Windows 目录中查找文件,但不在可执行文件所在的目录中查找。

最简单的方法是将所有ini文件放在Windows目录下。如果您发现将 ini 文件与 exe 文件放在一起更干净,那么您还有更多工作要做:

  • 找到可执行文件完整路径
  • ini替换exe结尾
  • 使用该完整路径访问您的私有(private) ini 文件

要获取可执行文件的名称,只需使用带有 NULL HMODULEGetModuleFileName 即可:

LPCTSTR getExecPath() {
DWORD len = 64;
for (;;) {
LPTSTR fileName = new TCHAR[len];
if (len == ::GetModuleFileName(NULL, fileName, len)) {
delete fileName;
len *= 2;
}
else {
return fileName;
}
}
}

或者如果您更喜欢直接获取 ini 文件名:

LPCTSTR getIniName() {
DWORD len = 4;
for (;;) {
LPTSTR fileName = new TCHAR[len];
if (len == ::GetModuleFileName(NULL, fileName, len)) {
delete fileName;
len *= 2;
}
else {
::lstrcpy(fileName + lstrlen(fileName) - 3, "ini");
return fileName;
}
}
}

不要忘记在完成后删除文件名,因为它是分配给新的...

根据评论编辑:

供引用,windows 目录可能取决于 windows 版本。但它始终可以通过 API 函数 GetWindowsDirectory 检索。摘自 reference page :

UINT WINAPI GetWindowsDirectory(
_Out_ LPTSTR lpBuffer,
_In_ UINT uSize
);

参数

  • lpBuffer [out] 指向接收路径的缓冲区的指针。除非 Windows 目录是根目录,否则此路径不以反斜杠结尾。例如,C盘的Windows目录名为Windows,则该函数检索到的Windows目录路径为C:\Windows。如果系统安装在C盘根目录下,则获取到的路径为C:。
  • uSize [in] lpBuffer 参数指定的缓冲区的最大大小,以 TCHAR 为单位。此值应设置为 MAX_PATH。

返回值

如果函数成功,返回值是复制到缓冲区的字符串的长度,以 TCHAR 表示,不包括终止空字符。

如果长度大于缓冲区的大小,则返回值是保存路径所需的缓冲区大小。

如果函数失败,返回值为零。要获取扩展的错误信息,请调用 GetLastError。 *

关于c++使用GetPrivateProfileString读取配置文件参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com