2014-10-07 3 views
0

Я вызываю метод GetPrivateProfileStringA(), чтобы читать значения из файла config.ini, но когда одно из моих значений превышает 3 цифры, оно сокращает значение до 3 (1234 станет 123).GetPrivateProfileStringA() отключить мое значение значения конфигурации

У меня есть файл 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; 

Я бы потерял, почему это происходит. Любая помощь приветствуется!

+1

Это очень плохой способ читать ini файлов. Этот API давно устарел. Пожалуйста, прекратите использовать его. Используйте чистый синтаксический анализатор файлов C++ ini. Здесь очень много. Веб-поиск откроет их. Кроме того, 'atol' - ужасный выбор для преобразования целых чисел. Вы уверены, что кодируете на C++? Похоже, что вы до сих пор кодирования в предварительной стандартизации C. –

+0

Привет @DavidHeffernan, спасибо за ваш ответ! Я найду ini-парсер и замените этот код. – LKB

+0

@DavidHeffernan - в отношении вашего комментария об atol, являющемся ужасным выбором для преобразования строк в int, что было бы лучшим способом сделать это? Почему это плохо? Извините, просто любопытно. – LKB

ответ

2

Вы используете sizeof() для iniVal, который вернет размер указателя на 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); 
+0

Спасибо, Ник! Вместо этого я заменил iniVal на стек, решив проблему. Anywho, я думаю, я пойду с предложением Дэвида Хеффернана использовать ini parser. – LKB

Смежные вопросы