C++ GetPrivateProfileStringA()切断我的配置值编号
我调用该方法是为了从config.ini文件中读取值,但是当我的一个值超过3位时,它会将值减少到3(1234将变为123) 我有一个config.ini文件,如下所示:C++ GetPrivateProfileStringA()切断我的配置值编号,c++,config,C++,Config,我调用该方法是为了从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 *i
[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位数字,因此我认为它与将值转换为长字符串无关
这是我的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(),如中所示
这是一种非常糟糕的读取ini文件的方法。那个API早就被弃用了。请停止使用它。使用纯C++ INI文件解析器。有很多。网络搜索会发现它们。另外,
atol
对于字符串到整数的转换是一个糟糕的选择。你确定你是用C++编码的吗?看起来您可能仍在使用预标准化C进行编码。您好@DavidHeffernan,谢谢您的回复!我将找到一个ini解析器并替换此代码。@DavidHeffernan-关于您关于atol是字符串到int转换的糟糕选择的评论,有什么更好的方法?为什么不好?抱歉,只是好奇。这很糟糕,因为它没有提供任何良好的错误检测机制。在C++-11中,您可以使用在发生故障时抛出异常的。对于旧的C++,你可能会使用StrueSt流。是的,我只是做了一点搜索,发现atol对错误检测很差。我不能使用C++-11,所以我将改为stringstream(这很难说,哈)。谢谢谢谢你,尼克!我替换了堆栈上的iniVal,解决了问题。不管是谁,我想我会同意@DavidHeffernan使用ini解析器的建议。
const size_t ArraySize = 256;
char *iniVal = new char[ArraySize];
...
GetPrivateProfileStringA("PASSPORT", "MinWidth", "200", iniVal, ArraySize , iniFilename);