GetPrivateProfileStringA()截断了我的配置值编号

GetPrivateProfileStringA() cutting off my config value number

本文关键字:我的 配置 编号 GetPrivateProfileStringA      更新时间:2023-10-16

我正在调用GetPrivateProfileStringA()方法,以便从config.ini文件中读取值,但当我的一个值超过3位数时,它会将值减少到3(1234将变为123)。

我有一个config.ini文件,它看起来像这样:

[PASSPORT]
MinWidth=200
MinHeight=300
[FEATURES]
MinEyeDistance=20
MaxEyeDistance=1000
...

我正在使用以下代码读取这个config.ini文件:

char iniFilename[] = "C:\config.ini";
char *iniVal = new char[256];
//check config.ini exists
if (std::ifstream(iniFilename))
{
    GetPrivateProfileStringA("PASSPORT", "MinWidth", "200", iniVal, sizeof(iniVal), iniFilename);
    configParam->minImageWidth = atol(iniVal);
    GetPrivateProfileStringA("PASSPORT", "MinHeight", "300", iniVal, sizeof(iniVal), iniFilename);
    configParam->minImageHeight = atol(iniVal);
    GetPrivateProfileStringA("FEATURES", "MinEyeDistance", "10", iniVal, sizeof(iniVal), iniFilename);
    configParam->minEyeDist = atol(iniVal);
    GetPrivateProfileStringA("FEATURES", "MaxEyeDistance", "1000", iniVal, sizeof(iniVal), iniFilename);
    configParam->maxEyeDist = atol(iniVal);
}

缓冲区字符串本身(iniVal)只得到3位数字,所以我不认为它与将值转换为long有任何关系。

这是我的configParam结构:

typedef struct _CONFIG_PARAMS
{
    long minImageWidth;
    long minImageHeight;
    long minEyeDist;
    long maxEyeDist;
} STRUCT_CONFIG_PARAMS;

我有点不明白为什么会发生这种事。感谢您的帮助!

您正在为iniVal使用sizeof(),它将返回指向char的指针的大小,而不是动态分配的数组的大小。由于在您的平台上这是4,因此会导致截断为3个字符和一个"\0"。

使用在堆栈上分配iniVal

char iniVal[256];

或者使用常量来分配数组,然后将其传递给GetPrivateProfileStringA(),如中所示

const size_t ArraySize = 256;
char *iniVal = new char[ArraySize];
...
GetPrivateProfileStringA("PASSPORT", "MinWidth", "200", iniVal, ArraySize , iniFilename);