c++ - GetPrivateProfileString - c++类 - 返回字符串 - 内存预计算

标签 c++ c winapi visual-c++ ini

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作为 lpAppNamelpKeyName参数,为了枚举所有可用值,而您提供的缓冲区太小,返回值将比缓冲区大小小两倍

分配策略

你将不得不动态分配缓冲区。所以你可能会使用 std::auto_ptrstd::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/

相关文章:

c++ - 使用指向方法的指针的 MSVC 编译器 fatal error C1001

c - C 中 SWITCH CASE 中的多个字符

winapi - DirextX9 Material 不再是用于学习Win32 API编程的 Material 吗?

c++ - 如何向 wxwidgets 类中创建的按钮添加命令?

c++ - stringstream 将 unsigned long 转换为带逗号的格式化数字字符串

c++ - 多重定义[...] 先在这里定义

c - localtime 的结果结构如何在 C 中分配?

c - getopt_long_only() 不工作

c# - 在一个程序中组合 32 位和 64 位 DLL

c++ - 从 LPTSTR 到 tstring 的转换导致运行时错误