|
Часть 6
- 238 -
Пример:
#include
#define NBYTES 1024
char from[NBYTES], to [NBYTES];
/* копирует n байтов из одного расположения в другое, пе-
реставляет (обменивает) каждую пару смежных байтов */
swab(from, to, NBYTES);.
SYSTEM
#include требуется только для объявления
функции
#include использует либо ,
либо
int system(string);
char *string; выполняемая команда
Описание.
Функция system передает заданную строку string к интерпре-
татору команд и обрабатывает эту строку как команду MS DOS. Функ-
ция system ссылается на переменные окружения COMSPEC и PATH, что-
бы расположить файл COMMAND.COM, который используется при выпол-
нении команды string.
Возвращаемое значение.
Если string успешно отработала, функция system возвращает
значение 0. Возвращаемое значение -1 свидетельствует об ошибке и
errno устанавливается в одно из следующих значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
E2BIG Список аргументов для команды превышает
128 байтов, или пространство, требуемое
для информации окружения, превышает 32К.
ENOENT COMMAND.COM не может быть найден.
ENOEXEC Файл COMMAND.COM не может быть
выполненным и имеет неверный формат.
ENOMEM Для выполнения child-процеса памяти не
достаточно, или эта память является
запорченной, или существуют неверные
блоки, указывающие, что parent-процесс
не захвачен.
- 239 -
См. также execl, execle, execlp, execv, execve, execvp,
exit, _exit, spawnl, spawnle, spawnlp, spawnlpe, spawnv, spawnve,
spawnvp.
Пример:
#include
int result;
/* следующий оператор добавляет номер версии DOS к log фай-
лу */
result = system("ver >> result.log");
TAN-TANH
#include
double tan(x); вычисляет тангенс x
double tanh(x); вычисляет гиперболический тангенс x
double x; радиан
Описание.
Функции tan и tanh вычисляют соответственно тангенс и ги-
перболический тангенс x.
Возвращаемое значение.
Функция tan возвращает тангенс x. Если x большой, при вы-
числениях может возникнуть частичная потеря значимости. В этом
случае tan вырабатывает ошибку PLOSS, но сообщения не печатает.
Если x настолько большой, что общая значимость результата теряет-
ся, тогда tan печатает сообщение об ошибке TLOSS в stderr и возв-
ращает 0. В обоих случаях errno устанавливается в ERANGE.
Функция tanh возвращает гиперболический тангенс x. Возвра-
щаемого значения в случае ошибки нет.
См.также acos, asin, atan, atan2, cos, cosh, sin, sinh.
Пример:
#include
double pi,x,y;
pi = 3.1415926535;
x = tan(pi/4.0); /* x равен 1.0 */
y = tanh(x); /* y равен 1.6 */
- 240 -
TEMPNAM - TMPNAM
#include
char *tmpnam(string);
char *string; указатель на временное имя.
char *tempnam(dir, prefix);
char *dir;
char *prefix;
Описание.
Функция tmpnan генерирует имя временного файла. Это имя
хранится в string. Если string является NULL, память для строк
размещается посредством функции malloc. При этом, если использо-
валась функция malloc, пользователь сам является ответственным за
освобождение памяти.
Символьная строка, созданная по tmpnam, состоит из цифр от
"0" до "9"; численное значение этой строки может изменяться от 1
до 65535.
Функция tempnam позволяет пользователю создать временный
файл в другом директории. Prefix является приставкой к имени фай-
ла. Эта функция рассматривает файл с заданным именем в других ди-
ректориях, расположенных в порядке старшинства.
УСЛОВИЕ ИСПОЛЬЗУЕМЫЙ ДИРЕКТОРИЙ
Устанавливается переменная Директорий, определяемый
окружения TMP, и существует по ТМР.
директорий, определяемый по
TMP.
Переменная окружения TMP не Аргумент dir для tempnam.
устанавливается или не
существует директорий,
определяемый по TMP.
Аргумент dir является NULL P_tmpdir в .
или dir является именем не
существующего директоия.
Не существует P_tmpdir. \tmp.
Если все это отсутствует, tempnam возвращает значение NULL.
Возвращаемое значение.
Эти функции возвращают указатель на сгенерированное имя,
если есть возможность создать это имя, или если имя не является
единственным (уникальным). Если имя не может быть создано или оно
всегда существует, функции tmpnam и tempnam возвращают значение
- 241 -
NULL
См. также tmpfile.
Пример:
#include
main ()
{
char *name1, *name2;
if ((name1 = tmpnam(NULL)) != NULL)
printf("%s is safe to use as a temporary file.\n",
name1);
else
printf("cannot create a unique file name\n");
if ((name2 = tempnam("a:\\tmp", "stq")) != NULL)
printf("%s is safe to use as a temporary file.\n",
name2);
else
printf("cannot create a unique file name\n");
}.
TELL
#include требуется только для объявления
функции
long tell(handle);
int handle; handle-р, ссылающийся на открытый
файл
Описание.
Функция tell берет текущую позицию указателя на файл (если
он есть), связанного с handle. Позиция выражается как число бай-
тов от начала файла.
Возвращаемое значение.
Функция tell возвращает текущую позицию. Возвращаемое зна-
чение -1L указывает на ошибку и errno устанавливается в EBADF,
которое определяет неверный аргумент handle-ра файла. Для устрой-
ств, не приспособленных к поиску (таких как терминалы и принте-
ры), возвращаемые значения не определены.
См.также ftell, lseek
Пример:
#include
#include
#include
- 242 -
int fh;
long position;
fh = open ("data", O_RDONLY);
.
.
.
position = tell (fh);
/* запоминает текущую позицию */
.
.
.
lseek (fh, position,0);
/* находит предыдущую позицию */
TIME
#include требуется только для объявления
функции
long time(timeptr);
long *timeptr; память для хранения времени
Описание.
Функция time в соответствии с системными часами возвращает
количество секунд, прошедших от 00:00:00 значения времени по
Гринвичу,т.е. с 1 января 1980 года. Возвращаемое значение хранит-
ся в расположении, заданном по timeptr. Если возввращаемое значе-
ние не запомнено, timeptr является NULL.
Возвращаемое значение.
Функция time возвращает пройденное время (в секундах). Воз-
вращаемого значения нет.
См.также asctime, ftime, gmtime, localtime, utime.
Пример:
#include
#include
long ltime;
time(<ime);
printf("the time is %s\n", ctime(<ime));
TMPFILE
- 243 -
#include
FILE *tmpfile(); значение, указывающее на
структуру типа FILE.
Описание.
Функция tmpfile создает временный файл и возвращает указа-
тель на этот файл. Если файл не может быть открыт, функция
tmpfile возвращает указатель NULL. Этот временный файл автомати-
чески удаляется, когда программа заканчивается нормально или ес-
ли вызвана функция rmtmp, а текущий рабочий директорий не был из-
менен.
Временный файл открывается в режиме "w".
Возвращаемое значение.
Эта функция возвращает указатель на поток. Если файл не от-
крывается - возвращается NULL-указатель.
См. также tmpnam, tempnam, rmtmp.
Пример:
#include
FILE *stream;
char tmpstring[] = "String to be temporary written".
main ()
{
if ((stream = tmpfile()) == NULL)
perror("Couldn't make temporary file");
else
fprintf(stream, "%s", tmpstring);
}.
TOASCII-_TOUPPER
#include
int toascii(c) преобразует "c" в символ ASCII
int tolower(c) преобразует "c" в символ верхнего
регистра (в строчную букву),
если это возможно
int _tolower(c) преобразует "c" в строчную букву
int toupper(c) преобразует "c" в символ нижнего
регистра (прописную букву), если
это возможно
int _toupper(c) преобразует "c" в символ нижнего
- 244 -
регистра
int c; преобразуемый символ
Описание.
Макро toascii, tolower, toupper и _toupper преобразуют сим-
вол "c" так, как описано ниже.
Макро toascii устанавливает первые 7 битов "c" в нуль так,
что преобразованное значение соответствует символу ASCII. Если
"c" уже соответствует ASCII, то он не изменяется.
Макро tolower преобразует "c" в строчную букву, если "c"
соответствует прописной литере. Иначе - "c" не изменяется.
Макро _tolower является версией tolower, использующейся
только тогда, когда "c" - прописная буква. Если это не так, ре-
зультат выполнения _tolower не определен.
Макро toupper преобразует "c" в строчную букву, если "c" не
является строчной буквой. Иначе - "c" не изменяется.
_Toupper является версией toupper, используемой только тог-
да, когда "c" - строчная буква. Если "c" не является строчной
буквой, то результат не определен.
Возвращаемое значение.
Макро toascii, tolower, toupper и _toupper возвращают пре-
образованный символ "c". Возвращаемого значения в случае ошибки
нет.
См.также isalnum, isalpha, isascii, iscntrl, isdigit,
isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit.
Замечание. Эти процедуры реализуются как макро. Однако
tolower и toupper также реализуются и как функции, т.к. версии
макро некорректно обрабатывают аргументы с побочными эффектами.
Версии функций могут быть использованы, если удалить макроопреде-
ления директивой #undef или не подключать . Определения
функций tolower и toupper даны в .
Пример:
#include
#include
int ch;
/*следующие операторы анализируют все
**символы между кодами 0х0 и 0х7f.
**Макро toupper и tolower применяются
**для любых кодов. _Toupper и _tolower
**применяются только для кодов, имеющих
**смысл */
for (ch=0; ch<=0x7f; ch++) {
printf (" toupper=%#04x", toupper (ch));
printf (" tolower=%#04x", tolower (ch));
- 245 -
if (islower(ch))
printf(" _toupper=%#04x", _toupper(ch));
if (isupper(ch))
printf("_tolower=%#40x", _tolower(ch));
putchar ('\n');
}
TZSET
#include требуется только для объявления
функции
void tzset();
int daylight; флаг перехода на летнее/зимнее
время
long timezone; различие в секундах от GMT
char *tzname[2]l строки трехбуквенных временных
зон
Описание.
Функция tzset использует текущую установку переменной окру-
жения TZ, чтобы назначить значения трем переменным: daylight,
timezone, tzname. Эти переменные используются функциями ftime,
localtime для изменения значения времени по Гринвичу (GMT) на
местное время.
Значением переменной окружения TZ должно быть трехбуквенное
имя временной зоны, такой как PST, следующей за необязательным
знаковым числом, задающим различие в часах между значением време-
ни по Гринвичу и местным временем.Число может идти за трехбуквен-
ной зоной перехода на летнее/зимнее время, такой как PDT. Напри-
мер, "PST8PDT" представляет действительное значение для зоны
Pacific time.
Когда вызывается tzset, переменным daylight, timezone,
tzname назначаются следующие значения:
Переменная Значение
timezone Различие между значением времени по
Гринвичу и местным временем
daylight Ненулевое значение, если в установке TZ
определен переход на летнее/зимнее
время; иначе -0
tzname[0] Строковое значение, определяющее
трехбуквенное имя временной зоны из
установки TZ
tzname[1] Строковое значение, определяющее зону
перехода на летнее/зимнее время, или
пустую строку, если эта зона пропущена
в установке TZ
- 246 -
Если TZ не установлена, по умолчанию устанавливается
PST8PDT, которая соответствует зоне Pacific time. По умолчанию
для daylight устанавливается 1, timezone - 28800, для tzname[0] -
"PST", tzname[1] - "PDT".
Возвращаемое значение.
Возвращаемого значения нет.
См.также asctime, ftime, localtime.
Пример:
#include
int daylight;
llong timezone;
char *tzname[];
.
.
.
putenv("TZ=EST5");
tzset();
ULTOA
#include требуется только для
объявления функции
char ultoa(value, string, radix);
unsigned long value; преобразуемое число
char *string; строка результата
int radix; основание value
Описание.
Функция ultoa преобразует символы value в символьную стро-
ку, оканчивающуюся NULL-символом, и запоминает ее в string. Пере-
полнение не контролируется. Аргумент radix определяет основание
системы счисления value. Он может принимать значения от 2 до 36.
Возвращаемое значение.
Функция ultoa возвращает указатель на строку string. Возв-
ращаемого значения в случае ошибки нет.
См.также itoa, ltoa.
Замечание: Память, отводимая под string, должна быть боль-
ше, чем требуется для возвращаемой строки. Функция возвращает
строку длиной до 33 байтов.
- 247 -
Пример:
#include
int radix = 16;
char buffer [40];
char *p;
/* p будет "501d9138 */
p=ultoa (1344115000L, buffer, radix);
UMASK
#include
#include
#include требуется только для объявления
функции
int umask(pmode);
int pmode; доступ, разрешенный по умолчанию
Описание.
Функция umask устанавливает для текущего процесса маску
разрешенного доступа для файла в режим, который определяется по
pmode. Маска разрешенного доступа используется для модификации
установленного доступа для новых файлов, созданных посредством
функций create, open или sopen. Если бит в маске равен 1, то со-
ответствующий ему бит в значении режима доступа к файлу устанав-
ливается в 0 (запрещение). Если бит в маске равен 0, соответству-
ющий ему бит остается неизмененным. Маска доступа для нового фай-
ла не установится, пока файл не закроется хотя бы один раз. Аргу-
мент pmode является константным выражением, содержащим одну или
обе манифестные константы S_IWRITE и S_IREAD, определенные в
.Когда заданы обе константы, они объединяются логичес-
ким опратором ИЛИ(:).
Значение аргумента pmode приводится ниже.
Значение Его смысл
S_IWRITE Запись не допускается (файл только для
чтения)
S_IREAD Чтение не допускается (файл только для
записи)
Например, если в маске установлен бит записи, любые новые
файлы будут доступны для чтения.
Замечание. В MS DOS все файлы доступны для чтения, поэтому
доступ только по записи задать невозможно. Это обозначает, что
установка бита чтения в umask не имеет смысла.
- 248 -
Возвращаемое значение.
Функция umask возвращает предыдущее значение pmode. Возвра-
щаемого значения в случае ошибки нет.
См.также chmod, creat, mkdir, open.
Пример:
#include
#include
#include
int oldmask;
oldmask=umask(S_IWRITE);
/* создать файлы только для чтения */
UNGETC
#include
int ungetc(c, stream);
int c; возвращаемый символ
FILE *stream; указатель на структуру типа
FILE
Описание.
Функция ungetc возвращает символ "c" в заданный поток ввода
stream. Stream должен быть буферизованным и открытым для чтения.
Последующая операция чтения из stream начинается с символа "c".
EOF вернуть в поток посредством использования ungetc нельзя. Эта
функция возвращает значение ошибки, если из stream ничего не про-
читано или если "c" назад не возвращен. Символы, размещаемые в
потоке посредством ungetc, могут быть уничтожены, если функции
fseek или rewind вызваны перед считыванием символа из stream.
Возвращаемое значение.
Эта функция возвращает аргумент символа "c". Возвращаемое
значение EOF свидетельствует о неудачном возвращении заданного
символа.
См. также getc, getchar, putc, putchar.
Пример:
#inc
#include
FILE *stream;
- 249 -
int ch;
int result = 0;
.
.
.
/* следующие операторы выбирают десятичное целое из потока
stream */
while ((ch = getc(stream)) != EOF && isdigit(ch))
result = result * 10 + ch - '0';
if (ch != EOF)
ungetc(ch, stream);
/* возвращает назад не десятичное целое. */
UNGETCH
#include требуется только для объявления
функции
int ungetch(c);
int c; возвращаемый символ
Описание.
Функция ungetch возвращает символ "c" на консоль и опреде-
ляет его как следующий читаемый символ. Функция ungetch не выпол-
няется, если перед следующим чтением она вызывается более чем
один раз.
Возвращаемое значение.
Функция ungetch возвращает символ "c", если функция удачно
отработала. Возвращаемое значение EOF указывает на ошибку.
См.также cscanf, getch, getche.
Пример:
#include
#include
char bufffer[100];
int count=0;
int ch;
/* следующий код берет обозначение, ограниченное пробелами
или новыми строками, из клавиатуры */
ch = getche();
while (isspace(ch))
ch = getche();
while (count < 99)
- 250 -
{ if (isspase(ch))
break;
buffer[count++] = ch;
ch = getche();
}
ungetch(ch);
buffer[count] = '\0';
UNLINK
#include требуется только для объявления
функции
#include использует либо , либо
int unlink(pathname);
char *pathname; path-имя удаляемого файла
Описание.
Функция unlink удаляет файл, определенный по pathname.
Возвращаемое значение.
Функция unlink возвращает 0, если файл успешно удален. Воз-
вращаемое значение -1 свидетельствует об ошибке и errno устанав-
ливается в одно из следующих значений:
Значение Его смысл
EACCES Path-имя определяет директорий или файл
только для чтения
ENOENT Файл или path-имя не найдено
См.также close, remove.
Пример:
#include
#include
int result;
result=unlink("tmpfile");
if (result == -1)
perror("couldn't delete tmpfile");
UTIME
#include
- 251 -
#include
int utime(pathname, times);
char *pathname; path-имя файла
struct utimbuf *times; указатель на хранимые
значения времени
Описание.
Функция utime устанавливает время модификации файла, кото-
рый определяется по pathname. Процесс должен иметь доступ по за-
писи к файлу, иначе время не будет изменяться.
Поскольку структура utimbuf содержит поле времени доступа,
в MS DOS устанавливается только время модификации.
Если times является NULL-указателем, время модификации ус-
танавливается по текущему времени. Иначе times должно указывать
на структуру типа utimbuf, определенную в . В этой
структуре время модификации устанавливается из поля modtime.
Возвращаемое значение.
Функция utime возвращает значение 0, если время модификации
было изменено. Возвращаемое значение -1 свидетельствует об ошиб-
ке и errno устанавливается в одно из следующих значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
EACCES Path-имя файла определяет директорий
или файл, предназначенный только для
чтения.
EMFILE Существует много открытых файлов
(файл должен быть открытым для
изменения времени его модификации).
ENOENT Файл или path-имя не найдено.
См. также asctime, ctime, fstat, ftime, gmtime, localtime,
stat, time.
Пример.
#include
#include
#include
#include
/* Время модификации файла устанавливается по текущему вре-
мени */
if (utime("/tmp/data", NULL) == -1)
perror ("utime failed").
- 252 -
VA_ARG - VA_START
#include требуется для
совместимости с UNIX V.
#include требуется для
совместимости со
стандартом ANSI C.
void va_start(arg-ptr); макро для установки
arg-ptr к началу
списка необязательных
аргументов (только
версия ).
void va_start(arg-ptr, prev-param);
макро для установки
arg-ptr к началу списка
необязательных аргу-
ментов (только версия
).
type va_start(arg-ptr, type); макро для возвращения
текущего аргумента
void va_arg(arg-ptr); макро для переустановки
arg-ptr
va_list arg-ptr; указатель на список
аргументов;
type тип возвращаемого
аргумента;
prev-param параметр, предшедствую-
щий первому
необязательному аргу-
менту (только версия
).
va_alist имя параметра для вызы-
ваемой функции (только
версия ).
va_dcl объявление va_alist
(только версия
).
Описание.
Макро va_start, va_arg, va_end обеспечивают способ доступа
к аргументам функции, когда она принимает переменное количество
аргументов.
Доступны 2 версии макро: макро, объявленные в ,
которые совместимы с определением системы UNIX 5, и макро, объяв-
ленные в , которые приведены в соответствии со стандар-
- 253 -
том ANSI C.
Обе версии макро предполагают, что функция принимает фикси-
рованное число требуемых аргументов, следующее за переменным чис-
лом необязательных аргументов. Требуемые аргументы объявлены как
необязательные параметры для функций и могут быть доступны через
имена параметров. Необязательные аргументы доступны через макро
или , которые устанавливают указатель на
первый необязательный аргумент в списке аргументов; возвращают
аргументы из списка и переустанавливают указатель, когда обработ-
ка аргументов завершена.
Макро системы UNIX 5, объявленные в , использу-
ются как показано ниже.
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 и объявленные в
, незначительно отличаются от макро, которые объявлены
в .
1. Все требуемые аргументы для функции объявляются как па-
раметры. Макро va_dcl не используется вместе с макро .
2. Макро va_start устанавливает arg-ptr на первый необяза-
тельный аргумент из списка аргументов, который передается функ-
ции. Аргумент arg-prt должен иметь тип va_list. Аргумент
prev-param является именем требуемого параметра, непосредственно
предшедствующего первому необязательному параметру из списка ар-
гументов. Макро va_start должна быть использована перед va_arg,
используемой в первый раз.
3. Макро va_arg выполняет следующее:
* возвращает значение типа type из того расположения, кото-
рое определяется по аргументу arg-ptr.
* чтобы указать на следующий аргумент в списке, она увели-
чивает arg-ptr и использует размер type для определения начала
- 254 -
расположения следующего аргумента.
Внутри функций макро va_arg может использоваться любое ко-
личество раз, чтобы возвратить требуемые аргументы из списка.
4. После возвращения всех аргументов, va_end переустанавли-
вает указатель в NULL.
Возвращаемое значение.
Макро va_arg возвращает текущий аргумент; va_start и va_end
значений не возвращают.
См. также vfprintf, vprintf, vsprintf.
Пример:
Ниже приводится листинг программы, использующей
для совместимости с UNIX V.
#include
#include
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++)
;
- 255 -
return (count ? (sum/count) : count);
}.
Аналогичная программа, перезаписанная для совместимости со
стандартом ANSI C.
#include
#include
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);
}.
- 256 -
VFPRINTF - VSPRINTF
#include
#include требуется для совместимости с
UNIX V.
#include требуется для совместимости со
стандартом ANSI C.
int vfprintf(stream, format-string, arg-ptr);
int vprintf(format-string, arg-ptr);
int vsprintf(buffer, format-string, arg-ptr);
FILE *stream; указатель на структуру типа
FILE.
char *buffer; память для хранения резуль-
тата
char *format-string; строка управления форматом
va_list arg-ptr; указатель на список аргу-
ментов.
Описание.
Функции vfprintf, vprintf, vsprintf форматируют и выводят
данные соответственно в поток stream, поток стандартного вывода и
буфер buffer. Эти функции похожи на свои двойники fprintf,
printf, sprintf, но используют указатель на список аргументов
вместо списка аргументов.
Format-string имеет ту же самую форму и функцию, что и ар-
гумент строки формата для функции printf; (см. описание функции
printf).
Параметр arg-ptr имеет тип va_list, определяемый в
и . Этот параметр указывает на список аргу-
ментов, которые преобразовываются и выводятся согласно соответст-
вующим спецификациям формата в format-string.
Возвращаемое значение.
Возвращаемым значением является количество выведенных сим-
волов.
См. также fprintf, printf, sprintf, va_arg, va_end,
va_start.
Пример:
В качестве примера приводится листинг программы, использую-
щей для совместимости с UNIX V.
#include
#include
main ()
{
- 257 -
int line = 1;
char *filename = "EXAMPLE";
.
.
.
error("Error: line %d, file %s\n", line, filename);
.
.
.
error("Syntax error\n");
}
error(va_alist);
va_dcl;
{
char *fmt;
va_list arg_ptr;
va_start(arg_ptr);
/* arg_ptr сейчас указывает на строку формата */
fmt = va_arg(arg_ptr, char *);
/* arg_ptr сейчас указывает на аргумент после строки форма-
та */
vprintf(fmt, arg_ptr);
va_end(arg_ptr);
}
На выходе:
Error: line 1, file EXAMPLE
Syntax error.
Ниже приводится аналогичная программа, перезаписанная для
совместимости со стандартом ANSI C.
#include
#include
main ()
{
int line = 1;
char *filename = "EXAMPLE";
.
.
.
error("Error: line %d, file %s\n", line, filename);
.
.
.
error("Syntax error\n");
}
error(fmt);
char *fmt;
- 258 -
{
va_list arg_ptr;
va_start(arg_ptr, fmt);
/* arg_ptr сейчас указывает на аргумент после строки форма-
та */
vprintf(fmt, arg_ptr);
va_end(arg_ptr);
}
На выходе:
Error: line 1, file EXAMPLE
Syntax error.
WRITE
#include требуется только для объявления
функции
int write (handle, buffer, count);
int handle; handle-р, ссылающийся на открытый
файл
char *buffer; записываемые данные
unsigned int count; число байтов
Описание.
Функция write записывает байты count из буфера buffer в
файл, связанный с handle. Операции write начинаются с текущей по-
зиции указателя на файл (указатель ассоциирован с заданным фай-
лом). Если файл открыт для добавления, операции выполняются в ко-
нец файла. После осуществления операций записи указатель на файл
(если он есть) увеличивается на количество действительно записан-
ных байтов.
Возвращаемое значение.
Функция write возвращает число действительно записанных
байтов. Возвращаемое значение должно быть положительным, но мень-
ше числа count (например, когда размер для записи count байтов
выходит за пределы пространства на диске). Возвращаемое значение
-1 указывает на ошибку; errno устанавливается в одно из следующих
значений:
ЗНАЧЕНИЕ ЕГО СМЫСЛ
EACCES файл открыт для чтения или закрыт для
записи
EBADF неверный handle-р файла
- 259 -
ENOSPC на устройстве нет свободного места
Если в файл записано более 32К (максимальный размер для
типа int), возвращаемое значение будет иметь тип unsigned int
(см.нижеследующий пример). Однако, максимальное число записывае-
мых байтов в файл равно 65534; поскольку число 65535 является не-
отличимым от -1, то возвращается ошибка. Если заданный файл отк-
рыт в текстовом режиме, каждый символ "Перевод строки" на выходе
заменяется парой "Возврат каретки-Перевод строки". Эта замена не
влияет на возвращаемое значение.
См.также fwrite, open, read.
Замечание. При записи в файл, открытый в текстовом режиме,
символ трактуется как логический конец файла. При записи на уст-
ройство символ в буфере влияет на окончание #include.
#include
#include
char buffer [60000];
main ()
{
int fh;
unsigned int nbytes = 60000, byteswritten;
if ((fh=open("c:/data/conf.dat",O_WRONLY))==-1) {
perror("open failed on output file");
exit (1);
}
if ((byteswritten=write(fh,buffer,nbytes))==-1)
perror ("");
else
printf("Wrote %u bytes to file\n",byteswritten);
.
.
.
}
.
- 260 -
П Р И Л О Ж Е Н И Е
Сообщения об ошибках
1. Введение
В этом приложении содержится список и описание значений, в
которые устанавливается переменная errno, если при вызове библио-
течной процедуры возникает ошибка. Заметим, что некоторые проце-
дуры сами устанавливают переменную errno. Сообщения об ошибках
связаны с каждым значением errno. Эти сообщения и сообщения, пос-
тавляемые пользователями, печатаются посредством применения функ-
ции perror.
Значение errno отражает соответствующее значение ошибки для
того вызова, в котором установлено errno. Значение errno автома-
тически не убирается. Поэтому, чтобы получить правильные резуль-
таты работы программы, нужно сразу же после вызова этой программы
проверять ее на ошибки и печатать соответствующие сообщения об
ошибках .
Include-файл содержит объявления значений errno.
Однако в MS DOS используются не все объявления, заданные в
. Include-файл содержит также полное множество значений,
которое обеспечивает поддержку совместимости с XENIX и UNIX
include-файлами, имеющими аналогичное имя. В этом приложении при-
водится список значений errno, используемых в MS DOS. Полный спи-
сок значений errno приведен в include-файле . Здесь со-
держится также список ошибок, возникающих при выполнении матема-
тических процедур. Эти ошибки соответствуют таким типам ошибок,
которые объявлены в и при возникновении математической
ошибки возвращаются функцией matherr.
2. Значения errno
В таблице А.1 заданы значения errno, используемые в MS DOS,
системные сообщения об ошибках, соответствующие каждому значению,
а также краткое описание случаев, повлекших ошибку.
Таблица А.1
Значения errno и их описания
Значение Сообщение Описание
E2BIG Список аргументов Список аргументов превышает
очень длинный. 128К или пространство,
требуемое для информации
окружения, превышает 32К.
- 261 -
EACCES Доступ Доступ запрещен: разрешение,
запрещен установленное для файла, не
задает требуемый доступ.
Эта ошибка возникает в тех
случаях, когда сделана
попытка доступа к файлу
путем, который несовместим
с атрибутами файла.
Например, ошибка возникла
при чтении из файла, кото-
рый не является открытым;
при записи в открытый файл,
предназначенный только для
чтения; при открытии
директория вместо файла. В
версиях MS DOS 3.0 и
старших EACCES может указы-
вать на нарушение блокиров-
ки или режима разделения.
Ошибка возникает также при
переименовании файла или
оглавления; при уничтожении
существующего директория.
EBADF Неверное файловое Значение handle для файла
число. не является правильным,либо
оно не ссылается на откры-
тый файл; либо сделана
попытка записи в файл или
на устройство, открытые
только для чтения (и наобо-
рот).
EDEADLOCK Может возникнуть Принудительная блокировка:
зависание файл не может быть
(тупик) блокирован после 10
попыток (для версии MS DOS
3.0 и последующих).
EDOM Математический Аргумент для математической
аргумент. функции не принадлежит
области определения этой
функции.
EEXIST Файл существует. Флаги O_CREATE и O_EXCL
определены при открытии
файла, но файл с заданным
именем уже существует.
EINVAL Неверный Задан неверный аргумент для
аргумент. одного из аргументов
функции. Например, значение
для origin (адрес начала
программы), задается, когда
- 262 -
указатель на файл находится
перед началом файла.
EMFILE Много открытых Другие handle-ры для файла
недоступны, так как нельзя
больше открыть другие файлы.
ENOENT Нет данного файла Заданный файл или
или директория. директорий не существует
или не может быть найден.
Это сообщение возникает,
если заданный файл не су-
ществует или в существующем
директории не определена
компонента path-имени.
ENOEXEC Ошибка .EXE- Сделана попытка создать
формата. файл, который не является
выполнимым или который
имеет неверный .EXE-формат.
ENOMEM Памяти недоста- Доступно недостаточно
точно. памяти. Это сообщение может
возникать, когда для
выполнения child-процесса
памяти недостаточно, или
когда для памяти невозможно
обеспечить такое расположе-
ние, которое требуется при
вызовах sbrk или getcwd.
ENOSPC На устройстве не Свободного пространства на
осталось свобод- устройстве недостаточно,
ного места чтобы произвести запись,
(например, диск полон).
ERANGE Результат очень Аргумент для математической
большой. функции очень большой, по-
этому происходит частичная
или полная потеря значимос-
ти результата. Эта ошибка
также может возникнуть в
других функциях, когда
аргумент больше, чем
предполагается. (Например,
когда аргумент path-имени
для функции getcwd больше,
чем предполагается).
EXDEV Перекрестная связь Сделана попытка перемещения
с устройством. файла на другое устройство
(используется ф-я rename).
- 263 -
3. Математические ошибки
Ошибки, приведенные ниже, порождаются математическими про-
цедурами библиотеки Си. Эти ошибки соответствуют только тем типам
ошибок, которые объявлены в , и возвращаются функцией
matherr. Более подробно обо всех ошибках приведено в описании
функции matherr в части 2 данного руководства.
Ошибка Описание
DOMAIN Аргумент для функции находится вне
области определения функции.
OVERFLOW Результат очень большой для предостав-
ления его в возвращаемом значении.
PLOSS Возникла частичная потеря значимости.
SING Особенность аргумента: аргумент для
функции имеет неверное значение
(например, пересылается значения 0 к
той функции, которая требует ненулевого
значения).
TLOSS Возникла общая потеря значимости.
UNDERFLOW Результат очень маленький для предоста-
вления его в возвращаемом значении.
|
|