Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GetPrivateProfileStringA()切断我的配置值编号_C++_Config - Fatal编程技术网

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

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

我调用该方法是为了从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位数字,因此我认为它与将值转换为长字符串无关

这是我的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);