Господа, признаюсь в Linux-е лет 7 если не 8, знание Cи поверхостное.
Но хватало по чуть-чуть править чужой код при сборке софта, а вот писать что-то самому ни в коем разе. Вот тут решил, - хватит, - надо восполнять пробелы в знаниях. Мал-помалу начал изучать. Так, для себя.
Вот тут сталкнулся с таким вопросом: подстановка данных из конфигфайла
в программу на Cи. Отсюда просьба расталкуйте мне, каким образом работает механизм подстановки данных и конфигфайлов?
Ну переменные в теле функций, - это понятно, но вот считывание и подставнока из внешнего файла для меня тёмный лес.:( Как открыть и прочитать файл знаю. Вообщем если не трудно объясните пожалуйста.
Если кто ещё маленький примерчик покажет буду очень признателен.:)
А в чем собственно проблема? Читаем очередную строку конфига, а потом разбираем в соответствии с правилами записи конфига. Потом следующую строку... Обычная работа со строками.
>Свои конфиги делать??
>Может лучше повозиться с libxml?
libxml оно хорошо, вот только мне что нибудь пониже из азов.:)
Так что пока отменяется. Я же сказал я пока учусь писать на простейшем.
Проблема в том, что не ясно как происходит само присваевание значений.:(
Мтак, кое что проесняется. Спасибо. Вот только для тупого можно прояснить вопрос, что такое правила записи?
Sorry что туплю< Но хочется разобраться в данном вопросе.:(
Ибо то что не понимаю, то не использую, а использовать хотелось бы.
Можно конечно делать mmap, но я тебе в учебных целях простой вариант покажу:
1) с помощью функции stat() - узнаем размер файла
2) malloc() - выделяем под него память
3) fopen() или open() - открываем и проверяем открылся ли
4) fread() или read() - читаем в выделенную память
5) fclose() или close() - закрываем
Предположим что у нас файл состоит из строк типа key=value
6) ищем конец строки или конец памяти
7) найденную строку разбиваем на части key и value
8) присваиваем внутреннему ключу прочитанное значение
9) goto 6
Навернуть тут можно все что угодно например создать массив структур
(ожидаемые имена переменных, их типы и значения по умолчанию), а на шаге 8 пытатся преобразовать прочитанное значение в тип который ожидается.
Очень просто. Допустим, в в конфиге программы есть строка вида
WorkspaceColor=Green
которая говорит о том, что в гипотетической программе рабочая область должна быть зеленой. Т.о. все параметры записываются в виде <имя опции>=<значение_опции>.
Тогда в программе должна быть функция, которая выделяет из этой строки правую часть (имя опции), а другая функция - левую часть. В программе так же должна быть переменная, хранящая значение этого параметра. Например:
int get_param(const char* szstr,char* szres)
{
int i=0;
while(szstr[i]!='=') {
szres[i]=szstr[i];
i++;
}
szres[i]='\0';
return i;
}
void get_value(const char* szstr,char* szres,int eq_pos)
{
for(int i=eq_pos+1;i<strlen(szstr);i++)
szres[i-eq_pos-1]=szstr[i];
szres[i-eq_pos-1]='\0';
}
Далее, в программе это будет выглядеть так:
int main()
{
char szcolor[64];
//...
FILE *fh=fopen("my_config","r");
char szbuf[64];
fgets(szbuf,64,fh);
if(szbuf[strlen(szbuf)-1]=='\n') //убираем перевод новой строки, если он есть
szbuf[strlen(szbuf)-1]='\0'; //
char szparam_name[64],szvalue[64];
get_value(szbuf,szvalue,get_param(szbuf,szparam_name));
if(strcmp(szparam_name,"WorkspaceColor")==0) //Ага! Это параметр WorkspaceColor
strcpy(szcolor,szvalue);
else if(...)
{
}
else
{
}
fclose(fh);
return 0;
}