2015-04-01 5 views
0

Обычно я использую Java для программирования. У меня есть только базовые знания C++. В настоящее время я использую JNI для вызова Windows API GetPrivateProfileSection().Как получить отдельные строки, возвращенные из GetPrivateProfileSection()

Я понимаю, что для этого мне нужно написать функцию C++. Я смутно знаком с тем, как это сделать. Проблема, с которой я сталкиваюсь, - это возвращаемая строка C++ из GetPrivateProfileSection().

Из документации Microsoft я понимаю, что возвращаемая строка содержит пары name = value, каждая из которых разделена символом NULL. Последняя фамилия = пара значений заканчивается двумя символами NULL.

Что я хочу сделать, это собрать все индивидуальные строки с именем = значение и поместить их в массив. Я совершенно не знаю, как это сделать с возвращенной строкой из GetPrivateProfileSection(). Я слышал, что мне нужно сделать что-то известное как арифметика указателей, но я не знаю, как это сделать.

Может ли кто-нибудь помочь мне? Благодаря!

ответ

0

код, который читает INI файл STD :: карта выглядит следующим образом:

LPTSTR str_settings = new TCHAR[bufferSize]; 

::GetPrivateProfileSection(_T("MySection"), str_settings , bufferSize, _T("MyIni.ini")); 

std::map<std::string, std::string> settings; // map key -> value from ini file 
std::string sett_string; 

for (;*str_settings; str_settings += sett_string.length() + 1) 
{ 
    sett_string = str_settings; 

    size_t pos = sett_string.find('='); 
    std::string key; 
    std::string value; 

    if (pos == std::string::npos) 
    { 
     key = sett_string; 
    } 
    else 
    { 
     key.assign(sett_string.begin(), sett_string.begin() + pos); 
     value.assign(sett_string.begin() + pos + 1, sett_string.end()); 
    } 

    settings[key] = value; 
} 
0

Спасибо за ваш ответ. Я экспериментировал с вашими исходными кодами в тестовой программе на C++, и он работал хорошо. Одна вещь, которую я заметил, это то, что класс std :: map очень похож на класс Java Properties.

Теперь моя цель состоит в том, чтобы получить каждую пару name = value и конкатрировать их обратно в спину в строке C++ с каждой пар name = value, разделенной символом \ r \ n.

После экспериментов в течение некоторого времени, я наконец придумал следующий код, который, кажется, работает:

void DoTest() 
{ 
const int bufferSize = 1024; 
LPTSTR str_settings = new TCHAR[bufferSize]; 
// Keep the original pointer. Need to delete later. 
LPTSTR str_settings_original = str_settings; 
// Another string to keep all name=value pairs back to back separated by \r\n. 
LPTSTR str_settings_concatenated = new TCHAR[bufferSize]; 

// I keep getting crash until I tried the following : 
// put a NULL character at the beginning of str_settings_concatenated. 
str_settings_concatenated[0] = NULL; 

::GetPrivateProfileSection(_T("MySection"), str_settings , bufferSize, _T("MyIni.ini")); 

std::string sett_string; 

for (;*str_settings; str_settings += sett_string.length() + 1) 
{ 
sett_string = str_settings; 
// str_settings effectively points to the next name=value pair 
// and this is what I really want. I take advantage of this 
// and pack them back-to-back into str_settings_concatenated 
// separated by \r\n. 
strcat(str_settings_concatenated, str_settings); 
strcat(str_settings_concatenated, "\r\n"); 
} 

delete str_settings_original; 
str_settings_original = NULL; 

delete str_settings_concatenated; 
str_settings_concatenated = NULL; 
} 

Важных моментов:

  • Я использовал свой цикл конструкцию, чтобы получить каждое имя = пара значений в str_settings.
  • На каждой итерации цикла for str_settings всегда получала следующую пару name = value, которая хорошо работает для меня, хотя я честно не знаю, как работает код (но вам большое спасибо).
  • Я создал еще одну строку C++ для хранения каждой пары name = value, каждая из которых разделена символом \ r \ n. Для этого я использовал strcat().
  • Первоначально у меня появилось много сбоев, а str_settings_concatenated, похоже, не получил ни одной из строк.
  • Я также помню, что в C++ мы должны вызывать delete для каждого распределения памяти с помощью new. Я попробовал это, и это не помогло. Тем не менее, я получил несколько советов от друга, который сказал мне, что должен положить символ NULL в начале str_settings_concatenated.

Код теперь хорошо работает. Если вы не возражаете, не могли бы вы также указать на любые другие ошибки, присутствующие в коде?

Еще раз спасибо за помощь.

David.

P.S .: Извините за использование опции «Ответ», чтобы опубликовать это. Не удалось опубликовать это как комментарий из-за ограничений характера.

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