Если вам не нужен произвольный доступ (т. Е. Файлы конфигурации не очень большие, и каждый из них может быть полностью захвачен сразу) и не требуют обработки внешними инструментами, вы можете просто использовать плоские текстовые файлы, содержащие, скажем,Tcl списки.«Хитрость» заключается в том, что в Tcl каждое значение должно иметь допустимое строковое представление (при запросе) и может быть восстановлено из его строкового представления.Вы получаете это бесплатно, то есть никакой специальный пакет не требуется, и все, что вам нужно предоставить, это какая-то структура для привязки сериализованных значений к их именам.
Для демонстрации:
set a "a string"
set b 536
set c {this is a list {with sublist}}
proc cf_write {fname args} {
set fd [open $fname w]
chan config $fd -encoding utf-8
set data [list]
foreach varName $args {
upvar 1 $varName var
lappend data [list $varName $var]
}
puts $fd $data
close $fd
}
proc cf_read fname {
set fd [open $fname]
chan config $fd -encoding utf-8
set data [read $fd]
close $fd
set data
}
set cfile [file join [file dir [info script]] conf.txt]
cf_write $cfile a b c
foreach entry [cf_read $cfile] {
lassign $entry name value
puts "$name: $value"
}
Вы получите такой вывод:
a: a string
b: 536
c: this is a list {with sublist}
Теперь, если вам хочется чего-то более необычного или «совместимого», посмотрите на YAML или JSON (выДля этого нужно написать сериализатор) или форматы INI - все они доступны из Tcllib и, следовательно, являются простыми Tcl.
Еще более интересным может бытьиспользуя XML через TDOM (расширение C на основе экспата). SQLite , который уже был предложен, обладает еще большими возможностями (обеспечивает произвольный доступ к данным, способен работать с огромными массивами данных).Но кажется, что для вашей задачи эти инструменты кажутся слишком тяжелыми.
Обратите внимание, что мой пример намеренно показывает, как хранить / восстанавливать произвольный специальный список переменных, поэтому процедура cf_write
создает список Tcl, который будет храниться отдельно.Конечно, никто не мешает вам создать его самостоятельно, обеспечивая создание иерархических структур произвольной сложности.Одно предупреждение: в этом случае вы можете (или не можете) столкнуться с проблемой деконструкции восстановленного списка.Но если вы будете придерживаться общего правила, согласно которому каждый элемент является парой имя / значение, как в моем примере, деконструкция не должна быть сложной.