infant_coder Ответов: 4

Чтение всех имен разделов из ini файла с помощью GetPrivateProfileSectionNames


Привет,
Чтение всех названий разделов из ini-файла.

Я получаю только первое название раздела, когда использую GetPrivateProfileSectionNames Как я могу получить название следующего раздела ? Пожалуйста помочь

// reading each section from ini file

  LPWSTR pSecNames= new WCHAR[1024];

  int nSectionNum = 0;
  wstring strSecName;

  DWORD retVal = GetPrivateProfileSectionNames(pSecNames,1024,profileFilePath.c_str());

  if (retVal)
  {
    strSecName.assign(pSecNames,retVal);
  }
  delete pSecNames;

  string sectionName = ToString(strSecName.c_str(),CP_UTF8);

4 Ответов

Рейтинг:
28

Pablo Aliskevicius

От MSDN:

lpszReturnBuffer [out]
A pointer to a buffer that receives the section names associated with the named file. The buffer is filled with one or more null-terminated strings; the last string is followed by a second null character.

Итак, если ваш INI - файл:
[Hello]
a=1
b=2
[World]
c=3
d=4

pSecNames будет "Hello\0World\0\0", а retVal-13.
Вам понадобится какая-то петля, чтобы прочитать их все:

// This is pseudo-code, I didn't compile it.
std::list<std::wstring> l;
for (wchar_t * p = pSecNames; *p; ++p)
{
    std::wstring ws(p);
    l.push_back(ws);
    p += ws.size();
    ASSERT(0 == *p);
}


Надеюсь, это поможет,

Пабло.


infant_coder

Привет Пабло,

Это мой ini файл
[Главный]
StartWithLastProfile=1

[Profile0]
Имя default
IsRelative=1
Путь=профили/sg3i9urv.по умолчанию
По умолчанию=1

Я умею читать только "общее". Я не могу получить следующее название раздела "Profile0". Пожалуйста помогите

Pablo Aliskevicius

Вы должны получить строку с "General\0Profile0\0\0". Таким образом, pSecNames + 9 должен указывать на "Profile0".

Рейтинг:
20

Resmi Anna

LPTSTR lpszReturnBuffer;     
lpszReturnBuffer = new TCHAR[MAX];     
char* pNextSection = NULL;        
GetPrivateProfileSectionNames(lpszReturnBuffer,MAX,IniPath);     
pNextSection = lpszReturnBuffer;     
printf("%s\n", pNextSection);           
CString csAllSections;
while (*pNextSection != 0x00)     
{         
    pNextSection = pNextSection + strlen(pNextSection) + 1;         
    if(*pNextSection != 0x00)         
    {             
        csAllSections += pNextSection;
    }     
} 



csAllSections будет иметь имя всех разделов. но не разделили. Вы должны справиться с этой логикой


Рейтинг:
2

pickwickkim

Хороший soln, но незначительная ошибка должна быть исправлена, как показано ниже, чтобы поймать от
название первой секции.

.... same as above

//can use vector<string> to place strings
vector<string> vsAllSections;

while (*pNextSection != 0x00)     
{         
    vsAllSections.push_back(pNextSection);
    pNextSection = pNextSection + strlen(pNextSection) + 1;         
} 


Richard MacCutchan

Этому решению уже восемь лет. Я сомневаюсь, что это имеет еще какое-то значение.

CHill60

Мне пришлось сделать много прокрутки вверх и вниз, чтобы попытаться понять, какое решение вы имеете в виду (я все еще не уверен). Если вы собираетесь прокомментировать решение, то либо используйте кнопку "есть вопрос или комментарий?" ссылка рядом с ним - это означает, что плакат будет проинформирован или предоставит полное решение в вашем собственном посте. По крайней мере, упомяните, о каком решении вы говорите!

Рейтинг:
2

Member 13258320

char * lpszReturnBuffer;
lpszReturnBuffer = new char[MAX];
int iCnt = GetPrivateProfileSectionNames(lpszReturnBuffer,MAX,strFileName.c_str());  

for(int i=0;i<iCnt;i++)
{
  if(lpszReturnBuffer[i] == '\0') //find null char
  {
    lpszReturnBuffer[i] = '^';//and replace it to separator.. whatever you want...
  }
}
	
string strT = lpszReturnBuffer;//convert to string
string strR;
iPosEnd = strT.find('^');//find first separator
while(iPosEnd != string::npos)
{
  strR = strT.substr(iPosStart, iPosEnd-iPosStart);//sub string..
  cb->AddString(strR.c_str());//this is my combobox.. replace code whatever you want....
  iPosStart = iPosEnd+1;
  iPosEnd = strT.find('^',iPosStart);
}


CHill60

Если вы собираетесь воскресить старые вопросы с новым решением, пожалуйста, добавьте некоторые комментарии (слова), чтобы объяснить, почему ваше решение лучше, чем то, которое спрашивающий принял в качестве решения 8 лет назад.

Member 13258320

Ничто хорошее.... как раз наоборот, насколько я понимаю....