我正在调用方法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;
我有点迷失为什么会这样。任何帮助表示赞赏!
答案 0 :(得分:2)
您正在对iniVal使用sizeof(),它会将指针的大小返回给char,而不是动态分配的数组的大小。由于您的平台上有4个,因此会导致截断为3个字符,并且会导致' \ 0'。
使用
在堆栈上分配iniValchar iniVal[256];
或使用常量来分配数组,然后将其传递给GetPrivateProfileStringA(),如
const size_t ArraySize = 256;
char *iniVal = new char[ArraySize];
...
GetPrivateProfileStringA("PASSPORT", "MinWidth", "200", iniVal, ArraySize , iniFilename);