CodeNet / Языки программирования / C / C++ / Linux/Unix / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник С/C++ для UNIX - Список функций
utime
UTIME
#include <sys\types.h>
#include <sys\utime.h>
int utime(pathname, times);
char *pathname; path-имя файла
struct utimbuf *times; указатель на хранимые
значения времени
Описание.
Функция utime устанавливает время модификации файла, кото-
рый определяется по pathname. Процесс должен иметь доступ по за-
писи к файлу, иначе время не будет изменяться.
Поскольку структура utimbuf содержит поле времени доступа,
в MS DOS устанавливается только время модификации.
Если times является NULL-указателем, время модификации ус-
танавливается по текущему времени. Иначе times должно указывать
на структуру типа utimbuf, определенную в <sys\utime.h>. В этой
структуре время модификации устанавливается из поля modtime.
Возвращаемое значение.
Функция utime возвращает значение 0, если время модификации
было изменено. Возвращаемое значение -1 свидетельствует об ошиб-
ке и errno устанавливается в одно из следующих значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
EACCES Path-имя файла определяет директорий
или файл, предназначенный только для
чтения.
EMFILE Существует много открытых файлов
(файл должен быть открытым для
изменения времени его модификации).
ENOENT Файл или path-имя не найдено.
См. также asctime, ctime, fstat, ftime, gmtime, localtime,
stat, time.
Пример.
#include <sys\types.h>
#include <sys\utime.h>
#include <stdio.h>
#include <stdlib.h>
/* Время модификации файла устанавливается по текущему вре-
мени */
if (utime("/tmp/data", NULL) == -1)
perror ("utime failed").
VA_ARG - VA_START
#include <varargs.h> требуется для
совместимости с UNIX V.
#include<stdarg.h> требуется для
совместимости со
стандартом ANSI C.
void va_start(arg-ptr); макро для установки
arg-ptr к началу
списка необязательных
аргументов (только
версия <varargs.h>).
void va_start(arg-ptr, prev-param);
макро для установки
arg-ptr к началу списка
необязательных аргу-
ментов (только версия
<stdarg.h>).
type va_start(arg-ptr, type); макро для возвращения
текущего аргумента
void va_arg(arg-ptr); макро для переустановки
arg-ptr
va_list arg-ptr; указатель на список
аргументов;
type тип возвращаемого
аргумента;
prev-param параметр, предшедствую-
щий первому
необязательному аргу-
менту (только версия
<stdarg.h>).
va_alist имя параметра для вызы-
ваемой функции (только
версия <varargs.h>).
va_dcl объявление va_alist
(только версия
<varargs.h>).
Описание.
Макро va_start, va_arg, va_end обеспечивают способ доступа
к аргументам функции, когда она принимает переменное количество
аргументов.
Доступны 2 версии макро: макро, объявленные в <varargs.h>,
которые совместимы с определением системы UNIX 5, и макро, объяв-
ленные в <stdarg.h>, которые приведены в соответствии со стандар-
том ANSI C.
Обе версии макро предполагают, что функция принимает фикси-
рованное число требуемых аргументов, следующее за переменным чис-
лом необязательных аргументов. Требуемые аргументы объявлены как
необязательные параметры для функций и могут быть доступны через
имена параметров. Необязательные аргументы доступны через макро
<varargs.h> или <stdarg.h>, которые устанавливают указатель на
первый необязательный аргумент в списке аргументов; возвращают
аргументы из списка и переустанавливают указатель, когда обработ-
ка аргументов завершена.
Макро системы UNIX 5, объявленные в <varargs.h>, использу-
ются как показано ниже.
1. Любые требуемые параметры для функции могут быть объяв-
лены обычным способом как параметры.
2. Последний параметр для функции представляет список нео-
бязательных аргументов. Этот параметр должен быть назван va_alist
(не перепутайте его с va_list, который объявлен как тип
va_alist).
3. Макро va_dcl появляется после объявления функции и перед
открытой левой скобкой функции. Эта макро объявляется как полное
описание параметра va_alist, оканчивающегося точкой с запятой,
однако, за va_dcl не может идти точка с запятой.
4. Внутри функции макро va_start устанавливает arg-ptr к
началу списка необязательных параметров, который передается функ-
ции. Макро va_start должна использоваться перед va_arg, использу-
емой в первый раз. Аргумент arg-ptr должен иметь тип va_list.
5. Макро va_arg выполняет следующее:
* возвращает значение заданного типа type из того располо-
жения, которое определяется по аргументу arg-ptr;
* увеличивает arg-ptr, чтобы указать на следующий аргумент
в списке, используя размер type для определения начала расположе-
ния следующего аргумента.
Внутри функций макро va_arg может использоваться любое ко-
личество раз, чтобы возвратить требуемые аргументы из списка.
6. После возвращения всех аргументов va_end устанавливает
указатель в NULL.
Макро, предлагаемые стандартом ANSI C и объявленные в
<stdarg.h>, незначительно отличаются от макро, которые объявлены
в <varargs.h>.
1. Все требуемые аргументы для функции объявляются как па-
раметры. Макро va_dcl не используется вместе с макро <stdarg.h>.
2. Макро va_start устанавливает arg-ptr на первый необяза-
тельный аргумент из списка аргументов, который передается функ-
ции. Аргумент arg-prt должен иметь тип va_list. Аргумент
prev-param является именем требуемого параметра, непосредственно
предшедствующего первому необязательному параметру из списка ар-
гументов. Макро va_start должна быть использована перед va_arg,
используемой в первый раз.
3. Макро va_arg выполняет следующее:
* возвращает значение типа type из того расположения, кото-
рое определяется по аргументу arg-ptr.
* чтобы указать на следующий аргумент в списке, она увели-
чивает arg-ptr и использует размер type для определения начала
расположения следующего аргумента.
Внутри функций макро va_arg может использоваться любое ко-
личество раз, чтобы возвратить требуемые аргументы из списка.
4. После возвращения всех аргументов, va_end переустанавли-
вает указатель в NULL.
Возвращаемое значение.
Макро va_arg возвращает текущий аргумент; va_start и va_end
значений не возвращают.
См. также vfprintf, vprintf, vsprintf.
Пример:
Ниже приводится листинг программы, использующей <varargs.h>
для совместимости с UNIX V.
#include <stdio.h>
#include <varargs.h>
main()
{
int n;
.
.
.
/* вызывается функция 4-х аргументов; последний аргумент
задается равным -1, чтобы отметить конец списка аргументов */
n = average(2, 3, 4, -1);
printf("Average is: %d\n", n);
.
.
.
/* вызывается функция 5-ти аргументов; последний аргумент
задается равным -1, чтобы отметить конец списка аргументов */
n = average(5, 7, 9, 11, -1);
printf("Average is: %d\n", n);
}
average(va_alist)
va_dcl
{
int i = 0, count = 0, sum = 0;
va_list arg_marker;
va_start(arg_marker);
/* возвращение аргументов и прибавление к sum, пока не вст-
ретится последний аргумент -1. */
for (; (i = va_arg(arg_marker, int)) >= 0;
sum+=i, count++)
;
return (count ? (sum/count) : count);
}.
Аналогичная программа, перезаписанная для совместимости со
стандартом ANSI C.
#include <stdio.h>
#include <stdarg.h>
main()
{
int n;
.
.
.
/* вызывается функция 4-х аргументов; последний аргумент
задается равным -1, чтобы отметить конец списка аргументов */
n = average(2, 3, 4, -1);
printf("Average is: %d\n", n);
.
.
.
/* вызывается функция 5-ти аргументов; последний аргумент
задается равным -1, чтобы отметить конец списка аргументов */
n = average(5, 7, 9, 11, -1);
printf("Average is: %d\n", n);
}
average(first)
int first;
{
int i = 0, count = 0, sum;
va_list arg_marker;
va_start(arg_marker, first);
/* первый аргумент прибавляется к sum и увеличивается
count; если первый аргумент равен -1, происходит возврат */
if (first != -1)
sum = first;
else
return (0);
count++;
/* возвращение дополнительных аргументов и прибавление к
sum, пока не встретится последний аргумент -1. */
for (; (i = va_arg(arg_marker, int)) >= 0;
sum+=i, count++)
;
return (sum/count);
}.
