Нужно прочитать конфигурационный файл в банальном формате параметр=значение игнорируя комментарии. Первое что приходит на ум fgets+strcmp и перебирать все строки. Если погуглить, то оказывается ничего особо лучше и нет, ну ладно. Для примера смотрю исходники ncmpc и запутываюсь ещё больше.
fgets просто читает строку до конца. Далее нужно пробежаться по ней и отделить всё что левее '=' записать как параметр, всё что правее как значение при этом не забывая про '#'. Всё в цикле пока не EOF.
Но я не врублюсь как скормить fgets-у новую строку из файла. Ведь если вызывать его в цикле то он всякий раз будет читать первую строку?
Вот как в ncmpc:
Код: Выделить всё
static int
read_rc_file(char *filename)
{
FILE *file;
char line[MAX_LINE_LENGTH];
if (filename == NULL)
return -1;
file = fopen(filename, "r");
if (file == NULL) {
perror(filename);
return -1;
}
while (fgets(line, sizeof(line), file) != NULL) {
char *p = g_strchug(line);
if (*p != 0 && *p != COMMENT_TOKEN)
parse_line(g_strchomp(p));
}
fclose(file);
return 0;
}
g_strchug и g_strchomp удаляют пробелы, если я правильно понял и это функции из glib но как это работает в упор не пойму. Как fgets узнаёт какую строку нужно читать? В man 3 fgets не посылать, был там, но не нашел ответа на свой вопрос. Тупо копировать чужой код не понимая как он работает не хочу, да и лишние зависимости типо glib не нужны.
Помогите въехать плз и подскажите другой более приятный способ разбора конфиг файла.