在 GetPrivateProfileString
中,lpReturnedString
返回 ini 文件特定部分的键中存在的字符串值。
我的问题是,我如何准确知道必须分配多少内存,而不是在调用此函数之前分配一大块内存。
DWORD WINAPI GetPrivateProfileString(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in LPCTSTR lpDefault,
__out LPTSTR lpReturnedString,
__in DWORD nSize,
__in LPCTSTR lpFileName
);
最佳答案
标准案例
GetPrivateProfileString
的返回值是复制到缓冲区的字符数,不包括空终止符。
因此,您可以从(比如说)100 _TCHAR
的缓冲区开始s 并检查返回值。如果是 99,那么要么你猜对了字符串的大小,要么(更有可能)你的缓冲区太小,所以扩大它并重试。
“枚举”案例
以上适用于从 .ini
中检索一个字符串值的标准情况文件。如果您改为传递 NULL
作为 lpAppName
或 lpKeyName
参数,为了枚举所有可用值,而您提供的缓冲区太小,返回值将比缓冲区大小小两倍。
分配策略
你将不得不动态分配缓冲区。所以你可能会使用 std::auto_ptr
或 std::unique_ptr
,或者可能是 std::vector<_TCHAR>
你可以resize()
如所须。如果您事先不知道字符串有多大,我建议您从 250 _TCHAR
开始。 s 并在每次发现缓冲区太小时将大小加倍。实际上,我敢打赌 99.9999% 的情况下 250 就足够了。
备选方案
存储在 %APPDATA%
下的 XML 文件;存储在 %APPDATA%
下的 JSON 文件, 注册表...
关于c++ - GetPrivateProfileString - c++类 - 返回字符串 - 内存预计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963944/