GetPrivateProfileStringA()切断我的配置值编号

时间:2014-10-07 08:33:42

标签: c++ config

我正在调用方法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;

我有点迷失为什么会这样。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

您正在对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);