Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Какой самый простой способ разобрать файл INI в C++?
Я пытаюсь разобрать файл INI с помощью C++. Какие-нибудь советы о том, что является лучшим способом для достижения этой цели? Должен ли я использовать инструменты Windows API для обработки файлов INI (с которыми я совершенно незнаком), решение с открытым исходным кодом или попытаться проанализировать его вручную?
Вы можете использовать функции Windows API, такие как GetPrivateProfileString() и GetPrivateProfileInt() .
Я никогда не анализировал файлы ini, поэтому я не могу быть слишком конкретным в этом вопросе.
Но у меня есть один совет:
Не изобретайте велосипед до тех пор, пока существующий соответствует вашим требованиям
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
Удачи :)
Если вы уже используете Qt
QSettings my_settings("filename.ini", QSettings::IniFormat);
Затем считайте значение
my_settings.value("GroupName/ValueName", <<DEFAULT_VAL>>).toInt()
Есть куча других конвертеров, которые преобразуют ваши значения INI как в стандартные типы, так и в типы Qt. Дополнительную информацию смотрите в документации Qt по QSettings.
этот вопрос немного устарел, но я опубликую свой ответ. Я протестировал различные классы INI (вы можете увидеть их на моем веб- сайте), а также использую simpleIni, потому что я хочу работать с файлами INI как на windows, так и на winCE. Window's GetPrivateProfileString() работает только с реестром на winCE.
Это очень легко читать с simpleIni. Вот такой пример:
#include "SimpleIni\SimpleIni.h"
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile(FileName);
const char * pVal = ini.GetValue(section, entry, DefaultStr);
inih -это простой парсер ini, написанный на C,он также поставляется с оболочкой C++. Пример использования:
#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";
Здесь же у автора есть список существующих библиотек .
Может быть, поздно answer..But, стоит знать options..If вам нужно кросс-платформенное решение, определенно вы можете попробовать GLIB,, его интересно.. ( https://developer.gnome.org/glib/stable/glib-Key-value-file-parser.html )
Я знаю, что этот вопрос очень стар, но я пришел к нему, потому что мне нужно было что-то кросс-платформенное для linux, win32... Я написал функцию ниже, это единственная функция, которая может анализировать файлы INI, надеюсь, другие найдут ее полезной.
правила & предостережения: buf для синтаксического анализа должен быть строкой с завершением NULL. Загрузите файл ini в строку массива char и вызовите эту функцию для его анализа. имена разделов должны быть заключены в скобки [], такие как этот [MySection], а также значения и разделы должны начинаться на строке без пробелов. Он будет анализировать файлы с Windows \r\n или с Linux \n окончаниями строк. Комментарии должны использовать # или // и начинаться в верхней части файла, никакие комментарии не должны смешиваться с данными ввода INI. Кавычки и тики обрезаются с обоих концов возвращаемой строки. Пробелы обрезаются только в том случае, если они находятся вне кавычки. Строки не обязательно должны содержать кавычки, а пробелы обрезаются, если кавычки отсутствуют. Вы также можете извлечь числа или другие данные, например, если у вас есть поплавок, просто выполните atof(ret) на буфере 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
}
Как пользоваться... образец....
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
}
В итоге я использовал inipp, который не упоминается в этой теме.
https://github.com/mcmtroffaes/inipp
Была только реализация MIT лицензионного заголовка, который был достаточно прост для добавления в проект и 4 строки для использования.