LINUX.ORG.RU

Научите....


0

0

 Господа, признаюсь в Linux-е лет 7 если не 8, знание Cи поверхостное.
Но хватало по чуть-чуть править чужой код при сборке софта, а вот писать что-то самому ни в коем разе. Вот тут решил, - хватит, - надо восполнять пробелы в знаниях. Мал-помалу начал изучать. Так, для себя.
 Вот тут сталкнулся с таким вопросом: подстановка данных из конфигфайла
в программу на Cи. Отсюда просьба расталкуйте мне, каким образом работает механизм подстановки данных и конфигфайлов?
Ну переменные в теле функций, - это понятно, но вот считывание и подставнока из внешнего файла для меня тёмный лес.:( Как открыть и прочитать файл знаю. Вообщем если не трудно объясните пожалуйста.
Если кто ещё маленький примерчик покажет буду очень признателен.:)

А в чем собственно проблема? Читаем очередную строку конфига, а потом разбираем в соответствии с правилами записи конфига. Потом следующую строку... Обычная работа со строками.

anonymous
()
Ответ на: комментарий от x86

>Свои конфиги делать??
>Может лучше повозиться с libxml?
libxml оно хорошо, вот только мне что нибудь пониже из азов.:)
Так что пока отменяется. Я же сказал я пока учусь писать на простейшем.

MoS
() автор топика
Ответ на: комментарий от anonymous

Проблема в том, что не ясно как происходит само присваевание значений.:(
Мтак, кое что проесняется. Спасибо. Вот только для тупого можно прояснить вопрос, что такое правила записи?
Sorry что туплю< Но хочется разобраться в данном вопросе.:(
Ибо то что не понимаю, то не использую, а использовать хотелось бы.

MoS
() автор топика

Самое простое, что приходит в голову.

/*
Для файла конфигурации example.conf формата "строка число":

идентификатор0 значение0
идентификатор1 значение1
...
идентификаторN значениеN

где N<16
*/

#include<stdio.h>

typedef struct ConfData{
    char ConfStr[16];
    int ConfData;} CONF_DATA;

void ParseConf(CONF_DATA *);

int main(void){
    FILE *ConfFile;
    CONF_DATA Data[16];
    int Index=0,FSize=0;
    ConfFile=fopen("example.conf","ro");
    /* Читаем файл конфигурации */
    while(!feof(ConfFile)){
        fscanf(ConfFile,"%s%d",Data[Index].ConfStr,&Data[Index].ConfData);

	Index++;}
    fclose(ConfFile);
    FSize=Index;
    /* Передаём данные конфигурации для последующей обработки */
    for(Index=0;Index<FSize;Index++)ParseConf((CONF_DATA *)&Data[Index]);
    exit(0);}

void ParseConf(CONF_DATA* Data){
	/* Отладочная печать */
	printf("%s %d\n",Data->ConfStr,Data->ConfData);
	/* Какие-то действия с данными
	.... */}

josephson ★★
()

Можно конечно делать 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 пытатся преобразовать прочитанное значение в тип который ожидается.

anonymous
()
Ответ на: комментарий от MoS

Очень просто. Допустим, в в конфиге программы есть строка вида
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;
}

Надеюсь, идея понятна.

anonymous
()
Ответ на: комментарий от anonymous

В принцыпе понятно. Спасибо всем.

MoS
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.