Jaki jest najprostszy sposób na analizę pliku INI w C++?
Próbuję przetworzyć plik INI używając C++. Jakieś wskazówki, jak najlepiej to osiągnąć? Czy powinienem używać narzędzi Windows API do przetwarzania plików INI (z którymi nie jestem całkowicie zaznajomiony), rozwiązania open-source, czy też próbować je przeanalizować ręcznie?
12 answers
Możesz używać funkcji Windows API, takich jak GetPrivateProfileString () I GetPrivateProfileInt () .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 20:06:53
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-10 06:37:08
Nigdy nie parsowałem plików ini, więc nie mogę być zbyt dokładny w tej kwestii.
Ale mam jedną radę.:
nie odkrywaj koła na nowo, dopóki istniejące spełnia Twoje wymagania
Http://en.wikipedia.org/wiki/INI_file#Accessing_INI_files
http://sdl-cfg.sourceforge.net/
http://sourceforge.net/projects/libini/
http://www.codeproject.com/KB/files/config-file-parser.aspx
Powodzenia:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 19:40:48
Używam SimpleIni . Jest wieloplatformowy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-30 15:25:37
Jeśli używasz już Qt
QSettings my_settings("filename.ini", QSettings::IniFormat);
Następnie odczytaj wartość
my_settings.value("GroupName/ValueName", <<DEFAULT_VAL>>).toInt()
Istnieje kilka innych konwerterów, które konwertują wartości INI na typy standardowe i typy Qt. Więcej informacji można znaleźć w dokumentacji Qt w QSettings.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-03 07:21:03
To pytanie jest trochę stare, ale zamieszczę swoją odpowiedź. Przetestowałem różne klasy INI (można je zobaczyć na mojej stronie ) i używam również simpleIni, ponieważ chcę pracować z plikami INI zarówno na windows, jak i winCE. Window ' s GetPrivateProfileString () działa tylko z rejestrem na winCE.
Jest bardzo łatwy do odczytania dzięki prostemu Oto przykład:
#include "SimpleIni\SimpleIni.h"
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile(FileName);
const char * pVal = ini.GetValue(section, entry, DefaultStr);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-26 22:11:04
Inih jest prostym parserem ini napisanym w języku C, jest również wyposażony w wrapper C++. Przykład użycia:
#include "INIReader.h"
INIReader reader("test.ini");
std::cout << "version="
<< reader.GetInteger("protocol", "version", -1) << ", name="
<< reader.Get("user", "name", "UNKNOWN") << ", active="
<< reader.GetBoolean("user", "active", true) << "\n";
Autor ma również listę istniejących bibliotek tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 12:51:41
Czy próbowałeś libconfig ; bardzo podobną do JSON składnię. Wolę to niż pliki konfiguracyjne XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-16 17:13:30
Jeśli jesteś zainteresowany przenośnością platformy, możesz również spróbować Boost./ Align = "left" / Obsługuje ini jako format persistancy, choć drzewo właściwości my be 1 poziom głęboki tylko.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-18 19:40:28
O ile nie planujesz tworzenia aplikacji międzyplatformowej, korzystanie z wywołań Windows API byłoby najlepszym sposobem. Po prostu zignoruj notatkę w dokumentacji API o tym, że jest dostępna tylko dla 16-bitowej zgodności aplikacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-15 20:10:46
Może późna odpowiedź..Ale, warto wiedzieć opcje..Jeśli potrzebujesz wieloplatformowego rozwiązania, zdecydowanie możesz spróbować GLIB,, jego interesujące.. ( https://developer.gnome.org/glib/stable/glib-Key-value-file-parser.html )
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 17:36:16
Wiem, że to pytanie jest bardzo stare, ale natknąłem się na nie, ponieważ potrzebowałem czegoś międzyplatformowego dla Linuksa, win32... Napisałem funkcję poniżej, jest to pojedyncza funkcja, która może parsować pliki INI, mam nadzieję, że inni uznają ją za przydatną.
Zasady i zastrzeżenia: BUF do analizy musi być zakończonym znakiem null. Załaduj swój plik ini do łańcucha tablicy znaków i wywołaj tę funkcję, aby ją przeanalizować. nazwy sekcji muszą mieć wokół siebie nawiasy [], takie jak ta [MySection], również wartości i sekcje muszą rozpocznij na linii bez spacji wiodącej. Będzie analizować pliki z Windows \R \ n lub z zakończeniami linii Linux \N. Komentarze powinny używać # lub / / i zaczynać się od góry pliku, żadne komentarze nie powinny być mieszane z danymi wejściowymi INI. Cudzysłowy i kleszcze są przycinane z obu końców zwracanego ciągu. Spacje są przycinane tylko wtedy, gdy znajdują się poza cytatem. Łańcuchy znaków nie muszą zawierać cudzysłowów, a białe spacje są przycinane, jeśli brakuje cudzysłowów. Możesz również wyodrębnić liczby lub inne dane, na przykład jeśli niech float wykona atof (ret) na buforze ret.
// -----note: no escape is nessesary for inner quotes or ticks-----
// -----------------------------example----------------------------
// [Entry2]
// Alignment = 1
// LightLvl=128
// Library = 5555
// StrValA = Inner "quoted" or 'quoted' strings are ok to use
// StrValB = "This a "quoted" or 'quoted' String Value"
// StrValC = 'This a "tick" or 'tick' String Value'
// StrValD = "Missing quote at end will still work
// StrValE = This is another "quote" example
// StrValF = " Spaces inside the quote are preserved "
// StrValG = This works too and spaces are trimmed away
// StrValH =
// ----------------------------------------------------------------
//12oClocker super lean and mean INI file parser (with section support)
//set section to 0 to disable section support
//returns TRUE if we were able to extract a string into ret value
//NextSection is a char* pointer, will be set to zero if no next section is found
//will be set to pointer of next section if it was found.
//use it like this... char* NextSection = 0; GrabIniValue(X,X,X,X,X,&NextSection);
//buf is data to parse, ret is the user supplied return buffer
BOOL GrabIniValue(char* buf, const char* section, const char* valname, char* ret, int retbuflen, char** NextSection)
{
if(!buf){*ret=0; return FALSE;}
char* s = buf; //search starts at "s" pointer
char* e = 0; //end of section pointer
//find section
if(section)
{
int L = strlen(section);
SearchAgain1:
s = strstr(s,section); if(!s){*ret=0; return FALSE;} //find section
if(s > buf && (*(s-1))!='\n'){s+=L; goto SearchAgain1;} //section must be at begining of a line!
s+=L; //found section, skip past section name
while(*s!='\n'){s++;} s++; //spin until next line, s is now begining of section data
e = strstr(s,"\n["); //find begining of next section or end of file
if(e){*e=0;} //if we found begining of next section, null the \n so we don't search past section
if(NextSection) //user passed in a NextSection pointer
{ if(e){*NextSection=(e+1);}else{*NextSection=0;} } //set pointer to next section
}
//restore char at end of section, ret=empty_string, return FALSE
#define RESTORE_E if(e){*e='\n';}
#define SAFE_RETURN RESTORE_E; (*ret)=0; return FALSE
//find valname
int L = strlen(valname);
SearchAgain2:
s = strstr(s,valname); if(!s){SAFE_RETURN;} //find valname
if(s > buf && (*(s-1))!='\n'){s+=L; goto SearchAgain2;} //valname must be at begining of a line!
s+=L; //found valname match, skip past it
while(*s==' ' || *s == '\t'){s++;} //skip spaces and tabs
if(!(*s)){SAFE_RETURN;} //if NULL encounted do safe return
if(*s != '='){goto SearchAgain2;} //no equal sign found after valname, search again
s++; //skip past the equal sign
while(*s==' ' || *s=='\t'){s++;} //skip spaces and tabs
while(*s=='\"' || *s=='\''){s++;} //skip past quotes and ticks
if(!(*s)){SAFE_RETURN;} //if NULL encounted do safe return
char* E = s; //s is now the begining of the valname data
while(*E!='\r' && *E!='\n' && *E!=0){E++;} E--; //find end of line or end of string, then backup 1 char
while(E > s && (*E==' ' || *E=='\t')){E--;} //move backwards past spaces and tabs
while(E > s && (*E=='\"' || *E=='\'')){E--;} //move backwards past quotes and ticks
L = E-s+1; //length of string to extract NOT including NULL
if(L<1 || L+1 > retbuflen){SAFE_RETURN;} //empty string or buffer size too small
strncpy(ret,s,L); //copy the string
ret[L]=0; //null last char on return buffer
RESTORE_E;
return TRUE;
#undef RESTORE_E
#undef SAFE_RETURN
}
Jak używać... przykład....
char sFileData[] = "[MySection]\r\n"
"MyValue1 = 123\r\n"
"MyValue2 = 456\r\n"
"MyValue3 = 789\r\n"
"\r\n"
"[MySection]\r\n"
"MyValue1 = Hello1\r\n"
"MyValue2 = Hello2\r\n"
"MyValue3 = Hello3\r\n"
"\r\n";
char str[256];
char* sSec = sFileData;
char secName[] = "[MySection]"; //we support sections with same name
while(sSec)//while we have a valid sNextSec
{
//print values of the sections
char* next=0;//in case we dont have any sucessful grabs
if(GrabIniValue(sSec,secName,"MyValue1",str,sizeof(str),&next)) { printf("MyValue1 = [%s]\n",str); }
if(GrabIniValue(sSec,secName,"MyValue2",str,sizeof(str),0)) { printf("MyValue2 = [%s]\n",str); }
if(GrabIniValue(sSec,secName,"MyValue3",str,sizeof(str),0)) { printf("MyValue3 = [%s]\n",str); }
printf("\n");
sSec = next; //parse next section, next will be null if no more sections to parse
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 15:50:40