, в которой имена файлов по умолчанию печатаются в столбцы, если терминалом является стандартный вывод, а если нет, они печатаются по одной на строчку.
6.5. Рекомендуемая литература
1. Mastering Algorithms With C by Kyle Loudon. O'Reilly & Associates, Sebastopol, California, USA, 1999. ISBN: 1-56592-453-3.
Эта книга предоставляет практическое, утилитарное введение в алгоритмы и структуры данных с использованием С, освещая среди прочих вещей таблицы хэшей, деревья, сортировку и поиск.
2. The Art of Computer Programming Volume 3. Sorting and Searching, 2nd edition, by Donald E. Knuth Addison-Wesley, Reading Massachusetts, USA, 1998. ISBN: 0-201-89685-0. [71]
На
эту книгу обычно ссылаются как на последнее слово в сортировке и поиске. Примите во внимание, что она значительно более сжата и труднее для чтения, чем книга Loudon'a.
3. Проект GTK+ [72] состоит из нескольких совместно работающих библиотек GTK+ является лежащим в основе инструментарием, используемым проектом GNU GNOME. [73] В основе иерархии библиотек располагается Glib, библиотека фундаментальных типов, структур данных и функций для работы с ними. Glib включает возможности для всех основных операций, которые мы до сих пор рассмотрели в данной книге, и многое другое, включая связанные списки и хэш-таблицы. Для просмотра онлайн-документов начните с веб-сайта проекта документации GTK+ [74] , щелкните на ссылке «Загрузить» (Download) и идите дальше по онлайн-версии.
71
Русский перевод Дональд E. Кнут. Искусство программирования Том 3. Сортировка и поиск (2-е издание). Москва • Санкт-Петербург • Киев, Вильямс, 2000 — Примеч. науч. ред.
72
http://www/gtk.org
— Примеч. автора.
73
http://www.gnome.org
— Примеч. автора.
74
http://www/gtk.org/rdp
— Примеч. автора.
6.6. Резюме
• Время внутренне хранится в виде значений
time_t
, представляющих «секунды с начала Эпохи». Эпоха для систем GNU/Linux и Unix начинается с полночи 1 января 1970 г. по UTC. Текущее время получается от системы с помощью системного вызова
time
, а
difftime
возвращает разницу в секундах между двумя значениями
time_t
.
• Структура
struct tm
представляет «разложенное время», которое является значительно более удобным представлением даты и времени.
gmtime
и
localtime
преобразуют значения
time_t
в значения
struct tm
, a
mktime
действует в обратном направлении.
•
asctime
и
ctime
осуществляют упрошенное форматирование значений времени, возвращая указатель на
static
строку символов фиксированного размера и формата,
strftime
предусматривает гораздо более гибкое форматирование, включая значения на основе местных настроек.
• Сведения о часовом поясе доступны через вызов
tzset
. Поскольку стандартные процедуры действуют так, как если бы они автоматически вызывали
tzset
, необходимость в непосредственном вызове этой функции возникает редко.
• Стандартной процедурой для сортировки массивов является
qsort
. Используя предоставленную пользователем функцию сравнения и принимая параметры числа элементов массива и их размера,
qsort
может сортировать любые виды данных. Это обеспечивает значительную гибкость.
•
scandir
читает в массив
struct dirent
каталог целиком. Для выбора того, какие элементы включить в массив и для обеспечения упорядочения элементов в массиве могут использоваться предоставленные пользователем функции
alphasort
является стандартной функцией для сортировки элементов каталога по имени;
scandir
передает функцию сортировки прямо через
qsort
.
• Функция
bsearch
работает подобно
qsort
. Она осуществляет быстрый бинарный поиск. Используйте ее, если цена линейного поиска перевешивает цену сортировки ваших данных. (Дополнительный API для поиска коллекций данных описан в разделе 14.4 «Расширенный поиск с помощью двоичных деревьев».)
• Базы данных пользователей и групп могут храниться в файлах на локальном диске или могут быть доступны через сеть. Стандартный API намеренно скрывает это различие. Каждая база данных обеспечивает как линейный просмотр всей базы данных, так и непосредственные запросы имени или ID пользователя/группы.
• Наконец, для тех случаев, когда недостаточно простого
stat
,
isatty
может вам сообщить, представляет ли открытый файл устройство терминала.
Упражнения
1. Напишите простую версию команды
date
, которая принимает в командной строке строку формата и использует ее для форматирования и вывода текущего времени.
2. Когда файл старше шести месяцев, '
ls -l
' использует для печати времени изменения более простой формат. GNU версия файла
ls.c
использует следующее вычисление:
3043 /* Время считается недавним, если оно в пределах последних 6
3044 месяцев. В Григорианском годе 365.2425 * 24 * 60 * 60 ==
3045 31556952 секунд в среднем. Запишите это значение как
3046 целую константу для избежания трудностей с плавающей точкой.*/
Сравните это с нашим примером вычисления шести прошлых месяцев. Каковы преимущества и недостатки каждого из методов?
3. Напишите простую версию команды
touch
, которая изменяет время модификации файла, имя которого указано в командной строке, на текущее время
4. Добавьте к вашей команде
touch
опцию, которая принимает в командной строке значения даты и времени и использует их в качестве нового времени модификации файлов, указанных в командной строке.
5. Добавьте к своей версии
touch
еще одну опцию, которая принимает имя файла и использует время модификации данного файла как новое время модификации файла, указанного в командной строке.
6. Усовершенствуйте
ch06-sortemp.c
так, чтобы она сортировала отдельный массив указателей, указывающих на массив сотрудников.
7. Добавьте к
ch06-sortdir.c
опции для сортировки по номеру индекса, времени модификации, времени доступа и размеру. Добавьте «обратную опцию», так, чтобы основанная на времени сортировка первым помещала самый недавний файл, а по другим критериям (размеру, индексу) помещала вначале наибольшее значение.
8. Напишите простую версию команды
chown
. Она должна использоваться так:
chown пользователь[:группа] файлы ...
Здесь пользователь и группа являются именами пользователя и группы, представляющими новых пользователя и группу для указанных файлов. Группа необязательна; если она присутствует, она отделяется от пользователя двоеточием. Чтобы протестировать свою версию на системе GNU/Linux, вы должны зарегистрироваться в качестве
root
. Делайте это осторожно!
9. Усовершенствуйте свою
chown
, чтобы допустить использование числовых значений пользователя или группы наряду с их именами.