Основанная на файле обработка конфигурации в C (Unix)

Пример Swift 3:

func captureScreen() -> UIImage? {
    guard let context = UIGraphicsGetCurrentContext() else { return .none }
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
    view.layer.render(in: context)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}
25
задан Jonathan Leffler 20 August 2018 в 00:53
поделиться

11 ответов

Хорошо, поэтому давайте поразим другую часть. Необходимо думать о том, что требуется иметь как "язык". В мире UNIX вид канонической версии является, вероятно, пробельным разделенным текстом (думайте /etc/hosts), или ":" разделенный текст (как /etc/passwd).

у Вас есть несколько опций, самое простое в некотором смысле быть для использования scanf (3). Снова, прочитайте страницу справочника для получения дополнительной информации но если запись строки будет чем-то как

port    100

тогда, то Вы будете искать что-то как

char inbuf[MAXLINE];
int  val;

scanf("%s %d\n", &inbuf[0], &val);

, можно получить немного больше гибкости, если Вы пишете простой синтаксический анализ FSA: считайте символы по одному из строки и используйте конечный автомат для определения, что сделать.

10
ответ дан cobbal 28 November 2019 в 18:13
поделиться

Hmmm там LibConfig.

я нашел его в Wiki

13
ответ дан Malx 28 November 2019 в 18:13
поделиться

Различные люди дали довольно хороший совет - пример чистого FTP интересен.

необходимо также читать TAOUP (Искусство Программирования Unix) E S Raymond. Это имеет примеры много конфигурационных файлов. Это также обрисовывает в общих чертах канонические идиомы для конфигурационных файлов. Например, необходимо, вероятно, позволить '#' запускать комментарий до конца строки и игнорировать пустые строки. Необходимо также решить то, что Вы сделаете, если конфигурационный файл будет содержать строку, Вы не понимаете - проигнорировать ли и продолжить тихо, или жаловаться ли. (Я предпочитаю вещи, которые жалуются; тогда я знаю, почему то, что я только что добавил, не имеет никакого эффекта - тогда как тихое игнорирование означает, что я не знаю, имеет ли запись, которую я просто добавил, какой-либо эффект.)

Другая проблема определяет местоположение конфигурационного файла. Вы делаете это скомпилированным - в месте местоположением установки по умолчанию с переменной среды для переопределения, или некоторой другой частью волшебства? Удостоверьтесь, что существует параметр командной строки, чтобы позволить конфигурационному файлу быть определенным абсолютно - даже рассматривают создание что единственный способ сделать это.

Иначе, в широких пределах, сохраните его простым, и все будут более счастливыми.

12
ответ дан Jonathan Leffler 28 November 2019 в 18:13
поделиться

Хорошо, вот реальный пример кода C:

/* demo-fgets -- read a "demo.text", copy to stdout with line
   numbers. */

#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 100

FILE * fp;
char bufr[MAXLINE];

extern int errno ;

int main(int argc, char ** argv){
    int count = 0 ;
    if((fp = fopen("demo.text","r")) != NULL){
        /* then file opened successfully. */
        while(fgets(bufr,MAXLINE,fp)!=NULL){
            /* then no read error */
            count +=1;
            printf("%d: %s",     /* no "\n", why? */
                   count, bufr);
        }
        /* fgets returned null */
        if(errno != 0){
            perror(argv[0]);    /* argv[0]?  Why that? */
            exit(1);
        }
        exit(0);                /* EOF found, normal exit */
    } else {                    /* there was an error on open */
        perror(argv[0]);
        exit(1);
    }
}

я выполняю его с этим входным файлом:

520 $ cat demo.text 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum
aliquet augue id quam. Sed a metus. Quisque sit amet quam. Sed id
ante. In egestas est non mi. Sed vel velit non elit vehicula
viverra. Curabitur eget tortor in ipsum vulputate
faucibus. Suspendisse imperdiet mauris at nibh. Sed interdum. Maecenas
vulputate, massa vel placerat mattis, ante est tincidunt sem, in
sollicitudin velit lacus non tortor. Etiam sagittis consequat nisl. 

Vestibulum id leo quis mauris gravida placerat. Donec aliquet justo a
tortor. Etiam nisi nibh, auctor non, luctus et, aliquam vitae,
metus. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Nunc lacinia quam a ligula. Nulla quis nisi eu
nunc imperdiet cursus. Nunc vitae nisi vitae tellus posuere
sollicitudin. Nunc suscipit, dui ac interdum euismod, pede nisl varius
dui, sed mattis libero mauris eu felis. Nam mattis dui eget
nunc. Suspendisse malesuada, pede eget posuere pellentesque, neque
eros pretium nibh, ut blandit dui leo dapibus orci. Etiam lacinia
lectus at orci. Donec ligula lacus, sagittis nec, sodales et,
fringilla lobortis, eros. Etiam sit amet nulla. Aliquam mollis pede id
enim. Etiam ligula felis, pulvinar nec, vestibulum molestie, interdum
ut, urna. Ut porta ullamcorper diam. Nullam interdum arcu. 

Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Etiam eu enim quis sem accumsan
tristique. Proin non sem. Etiam quis ante. Aenean ornare pellentesque
dolor. Praesent sodales. Cras dui velit, scelerisque a, accumsan a,
vestibulum in, dui. Pellentesque sed sapien. Etiam augue est,
convallis eget, egestas vel, molestie id, turpis. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus
mus. Cras posuere lorem eu diam. Ut ultricies velit. Nunc imperdiet
suscipit mauris. Vestibulum molestie elit id risus. Phasellus et
purus. Vestibulum id mauris. Fusce gravida elit quis turpis. Aliquam
ut est. 

Sed in mauris eu nulla rhoncus suscipit. Nam id dolor sit amet turpis
placerat sodales. Nunc ipsum. Quisque diam tellus, dapibus non,
interdum at, aliquam sit amet, tellus. Donec non pede eget massa
aliquam semper. Quisque dictum lacinia ipsum. Fusce magna purus,
mattis id, commodo et, lobortis eu, arcu. Vestibulum viverra neque a
nulla. Cum sociis natoque penatibus et magnis dis parturient montes,
nascetur ridiculus mus. Pellentesque vel felis in ligula blandit
auctor. Quisque quam. Curabitur turpis. Morbi molestie augue a
nisi. Nulla sollicitudin sagittis elit. Suspendisse in odio sed magna
dictum vestibulum. Duis facilisis lorem eget neque. Proin sit amet
urna eget velit scelerisque aliquam. Pellentesque imperdiet. Nullam
sapien. Nullam placerat ipsum eget metus. 

Mauris ornare risus eu velit. Morbi bibendum diam in sem. Morbi
aliquet nisl sit amet quam. Donec ornare sagittis nibh. Fusce ac
lectus. Sed sit amet risus. Integer facilisis commodo
sem. Pellentesque facilisis. Donec libero. Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
8
ответ дан Charlie Martin 28 November 2019 в 18:13
поделиться

Существует много путей. Вы не делаете потребность использовать fgetc. Необходимо, вероятно, прочитать stdio страницу справочника, но каноническая вещь состояла бы в том, чтобы открыть файл с fopen (3), затем считайте использование fgets (3) для чтения строки за один раз. Это посмотрело бы что-то как:

#include <stdio.h>

FILE * fp ;
char bufr[MAXLINE];

if((fp = fopen(filename, "r") != NULL){
    while(! feof(fp)){
         fgets(bufr, MAXLINE, fp);
         /* Do stuff */
    }
} else {
    /* error processing, couldn't open file */
}

Вы могли также посмотреть libini в SourceForge.

7
ответ дан Charlie Martin 28 November 2019 в 18:13
поделиться

Почему был бы Вы когда-либо запись этот код с нуля, это было сделано так много раз; просто найдите хорошую реализацию F/OSS и использование этим.

, Как Вы читаете из Текстового файла и обрабатываете каждую строку эффективно

, не волнуются об эффективности, она не имеет значения для чтения конфигурационных файлов. Пойдите для простоты и пригодности для обслуживания вместо этого.

5
ответ дан Ana Betts 28 November 2019 в 18:13
поделиться

Еще одно решение - Чистый-ftpd

В отличие от многих демонов, Чистых-FTPd, не читает конфигурационного файла. Вместо этого это использует параметры командной строки.... Добавление синтаксического анализатора для конфигурационных файлов в сервере является плохой идеей. Это замедляет все и нуждается в ресурсах ни для чего.

И для опций существует getopt

3
ответ дан Malx 28 November 2019 в 18:13
поделиться

Путем я сделал бы его (псевдокод):

while(there is input) {
  get one line;
  if (it is empty line || it beings with spaces followed by a '#') {
    skip this line, either empty or it's a comment;
  }
  find the position of the token that splits option name and its value;
  copy the option name and its value to separate variables;
  removing spaces before and after these variables if necessary;
  if (option == option1) {
     parse value for option 1;
  } else if (option == option2) {
     parse value for option 2;
  } else {
     handle unknown option name;
  }
  check consistency of options if necessary;
}

Примечание, что часть кода (проверяющий на пустые строки, комментарии и пробелы вокруг переменных) там, чтобы дать Вам дополнительную гибкость при записи файла конфигурации. Например, Вы не разрушите свою программу путем случайного отъезда дополнительного пространства тут и там.

Это предполагает, что у Вас есть файлы конфигурации, которые похожи на следующее:

# comment for option 1
option1 = value1

# comment for option 2
option2 = value2

...
4
ответ дан PolyThinker 28 November 2019 в 18:13
поделиться

Существует также getline () функция и друзья в GNU LibC

2
ответ дан dmityugov 28 November 2019 в 18:13
поделиться

Я записал чистое, зависимость меньше, событийно-ориентированный синтаксический анализатор файла INI в C только что. Я решил бросить его в общедоступный репозиторий Hg . Это лицензируется MIT, таким образом, Вы свободны использовать его любой, где Вам нравится.

2
ответ дан 28 November 2019 в 18:13
поделиться

Вы сделали, рассматривают хранения значений конфигурации как переменные среды?:) И файл конфигурации будет сценарием оболочки, который Вы выполняете перед своей программой. (на самом деле сценарий оболочки выполнит его для сохранения переменных). Тем путем Вы используете оболочку в качестве синтаксического анализатора конфигурации:)

Использование http://www.google.com/codesearch и "читает, конфигурация"

См. Пример для httpd

1
ответ дан Malx 28 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: