Основы программирования в Linux
Таким образом, обычная дата, такая же, как полученная из программы date, соответствует следующей строке формата функции
:strftime"%a %b %d %Н: %М: %S %Y"Для облегчения чтения дат можно использовать функцию
, принимающую строку с датой и временем и формирующую структуруstrptimeс теми же датой и временем:tm<b>#include <time.h></b><b>char *strptime(const char *buf, const char *format, struct tm *timeptr);</b>Строка
конструируется точно так же, как одноименная строка функцииformat. Функцийstrftimeдействует аналогично функцииstrptime: она сканирует строку в поиске опознаваемых полей и записывает их в переменные. В данном случае это элементы структурыsscanf, которая заполняется в соответствии со строкойtm. Однако спецификаторы преобразований дляformatнемного мягче спецификаторов функцииstrptime. Так, в функцииstrftimeразрешены как сокращенные, так и полные названия дней и месяцев. Любое из этих представлений будет соответствовать спецификатору %a функцииstrptime. Кроме того, в то время как функцияstrptimeдля представления чисел, меньших 10, всегда применяет ведущие нули,strftimeсчитает их необязательными.strptimeФункция
возвращает указатель на символ, следующий за последним, обработанным в процессе преобразования. Если она встречает символы, которые не могут быть преобразованы, в этой точке преобразование просто прекращается. Для того чтобы убедиться в том, что в структуруstrptimeзаписаны значимые данные, вызывающей программе следует проверять, достаточно ли символов строки принято и обработано.tmРассмотрим работу функций на примере (упражнение 4.9).
Упражнение 4.9. ФункциииstrftimestrptimeОбратите внимание на выбор спецификаторов преобразований, использованных в следующей программе:
#include <time.h>#include <stdio.h>#include <stdlib.h>int main() {struct tm *tm_ptr, timestruct;time_t the_time;char buf[256];char *result;(void)time(&the_time);tm_ptr = localtime(&the_time);strftime(buf, 256, "%A %d %B, %I:%S %p", tm_ptr);printf("strftime gives: %s\n", buf);strcpy(buf, "Thu 26 July 2007, 17:53 will do fine");printf("calling strptime with: %s\n", buf);tm_ptr = &timestruct;result = strptime(buf, "%a %d %b %Y, %R", tm_ptr);printf("strptime consumed up to: %s\n", result);printf("strptime gives:\n");printf ("date: %02d/%02d/%02d\n",tm_ptr->tm_year % 100, tm_ptr->tm_mon+1, tm_ptr->tm_mday);printf("time: %02d:%02d\n",tm_ptr->tm_hour, tm->ptr->tm_min);exit(0);}Когда вы откомпилируете и выполните программу strftime.c, то получите следующий результат:
$ <b>./strftime</b>strftime gives: Saturday 09 June, 08:16 AMcalling strptime with: Thu 26 July 2007, 17:53 will do finestrptime concurred up to: will do finestrptime gives:date: 07/07/26time: 17:53Как это работает
Программа strftime получает текущее местное время с помощью вызовов функций
иtime. Затем она преобразует его в удобочитаемую форму с помощью функцииlocaltimeс подходящим аргументом форматирования. Для демонстрации применения функцииstrftimeпрограмма задает строку, содержащую дату и время, затем вызывает strptime для извлечения необработанных значений времени и даты и выводит их на экран. Спецификатор преобразованияstrptimeфункции%R— это сокращенное обозначение комбинацииstrptime.%Н:%MВажно отметить, что для успешного просмотра даты функции strptime необходима точная строка формата. Обычно она не может точно обработать даты, считываемые из строк, введенных пользователями, до тех пор, пока не будет строго выверен формат.
Возможно, при компиляции программы strftime.c вы получите предупреждение компилятора. Причина в том, что по умолчанию в библиотеке GNU не объявлена функция
. Для устранения проблемы следует явно запросить средства стандарта X/Open, добавив следующую строку перед заголовочным файлом time.h:strptime#define _XOPEN_SOURCEВременные файлы
Зачастую программы нуждаются в возможности использования временного хранилища в виде файлов. В них могут храниться промежуточные результаты вычислений, или резервные копии файлов, сделанные перед выполнением критических операций. Например, приложение для работы с базой данных может применять временный файл при удалении записей. В файле собираются элементы базы данных, нуждающиеся в сохранении, и затем в конце процесса временный файл становится новой базой данных, а исходная база данных удаляется.
У столь популярных временных файлов есть скрытый недостаток. Вы должны следить за тем, чтобы приложения выбирали уникальное имя для временного файла. Если это условие не соблюдается, могут возникнуть проблемы. Поскольку ОС Linux — многозадачная система, другая программа может выбрать то же самое имя, и обе будут мешать друг другу.
Уникальное имя файла генерируется с помощью функции
:tmpnam