Как инициализировать программу C с помощью файла, среды и/или командной строки?

Вы должны быть очень осторожны с названиями радио и усилителями. ценности. Я обновил ваши имена и значения опционально вместе с функциональностью для получения выбранных значений , см. Демонстрацию ниже - [116 ]

function handleClick(event) {
    event.preventDefault();
    // Get all the inputs.
    var inputs = form1.elements;
    var radios = [];

    //Loop and find only the Radios
    for (var i = 0; i < inputs.length; ++i) {
        if (inputs[i].type == 'radio') {
            radios.push(inputs[i]);
        }
    }

    //var found = 1;
    for (var i = 0; i < radios.length; i++) {
        if (radios[i].checked) {
            console.log(radios[i].value);
            //found = 0;
            //break;
        }
    }

    return false; // prevent further bubbling of event
}
<form name="form1" onsubmit='handleClick(event)'>
    <div class="dt">
        <div class="dtb">
            <div class="dtr">
                <div class="one">1</div>
                <div class="two">a</div>
                <div class="three"><input name="a" type="radio" value="1m" required /></div>
                <div class="four"><input name="a" type="radio" value="1s" required /></div>
                <div class="five">Aardig, vriendelijk</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">b</div>
                <div class="three"><input name="b" type="radio" value="1m" required /></div>
                <div class="four"><input name="b" type="radio" value="1s" required /></div>
                <div class="five">Overtuigend, overredend</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">c</div>
                <div class="three"><input name="c" type="radio" value="1m" required /></div>
                <div class="four"><input name="c" type="radio" value="1s" required /></div>
                <div class="five">Terughoudend, bescheiden, gereserveerd</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">d</div>
                <div class="three"><input name="d" type="radio" value="1m" required /></div>
                <div class="four"><input name="d" type="radio" value="1s" required /></div>
                <div class="five">Origineel, inventief, individualistisch</div>
            </div>
        </div>
    </div>
    <div class="dt">
        <div class="dtb">
            <div class="dtr">
                <div class="one">2</div>
                <div class="two">a</div>
                <div class="three"><input name="a2" type="radio" value="2m" required /></div>
                <div class="four"><input name="a2" type="radio" value="2s" required /></div>
                <div class="five">Charmant, attractief, trekt anderen aan</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">b</div>
                <div class="three"><input name="b2" type="radio" value="2m" required /></div>
                <div class="four"><input name="b2" type="radio" value="2s" required /></div>
                <div class="five">Co&ouml;peratief, aangenaam</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">c</div>
                <div class="three"><input name="c2" type="radio" value="2m" required /></div>
                <div class="four"><input name="c2" type="radio" value="2s" required /></div>
                <div class="five">Koppig, onbuigzaam</div>
            </div>
            <div class="dtr">
                <div class="one">&nbsp;</div>
                <div class="two">d</div>
                <div class="three"><input name="d2" type="radio" value="2m" required /></div>
                <div class="four"><input name="d2" type="radio" value="2s" required /></div>
                <div class="five">Lief, innemend</div>
            </div>
        </div>
    </div>
    <input type="submit" value="Submit" />
    <input type="reset" value="reset" />
</form>

5
задан Daniel A. White 12 May 2015 в 10:49
поделиться

6 ответов

Основы:

  • Чтобы сконфигурировать вашу программу с использованием переменных среды, вы можете использовать функцию getenv, определенную в stdlib.h.
  • Чтобы сконфигурировать вашу программу с использованием аргументов командной строки, объявите Функция main, такая как 'int main (int argc, const char * const * argv)', и использование цикла для перемещения по аргументам в массиве argv. Его размер задается argc.
  • Чтобы сконфигурировать вашу программу с помощью файла конфигурации, желательно выбрать какую-нибудь библиотеку, делающую это для вас, вместо того, чтобы придумывать еще один пользовательский формат файла конфигурации. Обратите внимание, что в зависимости от платформы, на которую вы ориентируетесь, существуют также библиотеки для анализа аргументов командной строки.

Какой источник настроек должен перекрывать друг друга, зависит от приложения, но, на мой взгляд, обычно аргумент командной строки> переменная среды> файл конфигурации имеет больше смысла.

Вот пример получения конфигурации из среды и командной строки с перезаписывающей средой командной строки:

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

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}

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

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

с перезаписывающей средой командной строки:

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

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}

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

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

с перезаписывающей средой командной строки:

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

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}

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

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

поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функций.

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

поэтому лучше использовать существующую библиотеку, если она существует для желаемой целевой платформы (платформ), или, по крайней мере, разделить этот вид кода на ряд функций.

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

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

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

5
ответ дан 18 December 2019 в 10:48
поделиться

Эрик Рэймонд освещает многое из этого в разделе 10 из Искусство программирования Unix Очевидно, что это ориентировано на Unix, но большинство принципов может быть применено в любой ОС.

5
ответ дан 18 December 2019 в 10:48
поделиться

Существуют тонны библиотек для разбора файла конфигурации для различных форматов. Ищите форматы XML и INI для двух популярных вариантов. Написание нестандартного парсера, вероятно, плохая идея, так как может потребоваться много работы за небольшую выгоду или без нее. Здесь - это случайная библиотека C для анализа файлов INI, XML оставлен в качестве упражнения.

Приоритет между настройками обычно таков, что параметры командной строки переопределяют любое «окружение» Настройки. Я бы предложил такие приоритеты в порядке убывания важности:

  1. Параметры командной строки переопределяют все, что угодно
  2. Файл настроек следующий
    • Иногда разделяются между локальными и системными глобальными файлами пользователя.
  3. Далее идут переменные среды.

Но 2 и 3 вполне могут быть перевернуты.

2
ответ дан 18 December 2019 в 10:48
поделиться

Для Unix-подобных шаблонов проектирования в этой области см. Раймонд "Искусство из Unix Programming ". В нем обсуждается расстановка приоритетов аргументов командной строки над переменными среды и файлами конфигурации и т. Д.

1
ответ дан 18 December 2019 в 10:48
поделиться

Вопрос не совсем ясен. Является ли вопрос «какие механизмы существуют?», «Каковы соглашения для аргументов и форматов?» Или «как я должен смешивать и сопоставлять?»?

Есть несколько довольно стандартных способов (по крайней мере, в мире Unix ):

  • переменные среды
  • файлы конфигурации
  • аргументы командной строки
  • в качестве подмножества вышеупомянутых, файлы конфигурации, указанные в командной строке

Чтобы выбрать, какие методы использовать для своей собственной программы, изучите Многие программы из канона общепринятой практики, прежде чем вы замораживаете свой собственный выбор, читаете некоторые блоги, читаете некоторые книги ...

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

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

  1. Разобрать командную строку и установить любые переменные которые влияют на дальнейшие настройки (скажем, какой файл конфигурации нужно прочитать)
  2. Обработка файлов конфигурации и переменной среды (в каком порядке?)
  3. Перезапустите командную строку, чтобы переопределить все остальные настройки.

В традиции Unix посмотрите на getopt и getopt_long . Также рассмотрим такие инструменты, как gengetopt

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


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

но следует сэкономить на ошибках и путанице.


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

но следует сэкономить на ошибках и путанице.


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

2
ответ дан 18 December 2019 в 10:48
поделиться

Язык Lua отчасти возник из-за необходимости иметь четко определенный язык конфигурации для набора инструментов. Остается довольно легко интегрировать Lua в качестве языка конфигурации. Достаточно полный пример можно найти в книге «Программирование на Lua», более старая версия которой доступна в Интернете. Глава 25 описывает использование Lua C API для встраивания Lua в качестве языка конфигурации и причины, по которым вы могли бы захотеть это сделать.

1
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

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