7.7. Обработка ошибок - STDERR и EXIT
Обработка ошибок в CAT неидеальна. Неудобство заключает-
ся в том, что если один из файлов по некоторой причине ока-
зывается недоступным, диагностическое сообщение об этом пе-
чатается в конце объединенного вывода. Это приемлемо, если
вывод поступает на терминал, но не годится, если вывод пос-
тупает в некоторый файл или через поточный (PIPELINE) меха-
низм в другую программу.
Чтобы лучше обрабатывать такую ситуацию, к программе
точно таким же образом, как STDIN и STDOUT, присоединяется
второй выходной файл, называемый STDERR. Если это вообще
возможно, вывод, записанный в файле STDERR, появляется на
терминале пользователя, даже если стандартный вывод направ-
ляется в другое место.
Давайте переделаем программу CAT таким образом, чтобы
сообщения об ошибках писались в стандартный файл ошибок.
“INCLUDE <STDIO.H>
MAIN(ARGC,ARGV) /*CAT: CONCATENATE FILES*/
INT ARGC;
CHAR *ARGV[];
\(
FILE *FP, *FOPEN();
IF(ARGC==1) /*NO ARGS; COPY STANDARD INPUT*/
FILECOPY(STDIN);
ELSE
WHILE (--ARGC > 0)
IF((FP=FOPEN(*++ARGV,”R#))==NULL) \(
PRINTF(STDERR,
“CAT: CAN'T OPEN,%S\N”, ARGV);
EXIT(1);
\) ELSE \(
FILECOPY(FP);
\)
EXIT(0);
\)
Программа сообщает об ошибках двумя способами. Диагностичес-
кое сообщение, выдаваемое функцией FPRINTF, поступает в
STDERR и, таким образом, оказывается на терминале пользова-
теля, а не исчезает в потоке (PIPELINE) или в выходном фай-
ле.
Программа также использует функцию EXIT из стандартной
библиотеки, обращение к которой вызывает завершение выполне-
ния программы. Аргумент функции EXIT доступен любой програм-
ме, обращающейся к данной функции, так что успешное или неу-
дачное завершение данной программы может быть проверено дру-
гой программой, использующей эту в качестве подзадачи. По
соглашению величина 0 в качетсве возвращаемого значения сви-
детельствует о том, что все в порядке, а различные ненулевые
значения являются признаками нормальных ситуаций.
· 164 -
Функция EXIT вызывает функцию FCLOSE для каждого откры-
того выходного файла, с тем чтобы вывести всю помещенную в
буферы выходную информацию, а затем вызывает функцию _EXIT.
Функция _EXIT приводит к немедленному завершению без очистки
каких-либо буферов; конечно, при желании к этой функции мож-
но обратиться непосредственно.
7.8. Ввод и вывод строк
Стандартная библиотека содержит функцию FGETS, совершен-
но аналогичную функции GETLINE, которую мы использовали на
всем протяжении книги. В результате обращения
FGETS(LINE, MAXLINE, FP)
следующая строка ввода (включая символ новой строки) считы-
вается из файла FP в символьный массив LINE; самое большое
MAXLINE_1 символ будет прочитан. Результирующая строка за-
канчивается символом \ 0. Нормально функция FGETS возвращает
LINE; в конце файла она возвращает NULL. (Наша функция
GETLINE возвращает длину строки, а при выходе на конец файла
· нуль).
Предназначенная для вывода функция FPUTS записывает
строку (которая не обязана содержать символ новой строки) в
файл:
FPUTS(LINE, FP)
Чтобы показать, что в функциях типа FGETS и FPUTS нет ничего таинственного, мы приводим их ниже, скопированными непосредственно из стандартной библиотеки ввода-вывода:
#INCLUDE <STDIO.H>
CHAR *FGETS(S,N,IOP) /*GET AT MOST N CHARS FROM IOP*/
CHAR *S;
INT N;
REGISTER FILE *IOP;
\(
REGISTER INT C;
REGISTER CHAR *CS;
CS = S;
WHILE(--N>0&&(C=GETC(IOP)) !=EOF)
IF ((*CS++ = C)=='\N')
BREAK;
*CS = '\0';
RETURN((C==EOF && CS==S) 7 NULL : S);
\)
FPUTS(S,IOP) /*PUT STRING S ON FILS IOP*/
REGISTER CHAR *S;
REGISTER FILE *IOP;
\(
REGISTER INT C;
WHILE (C = *S++)
PUTC(C,IOP);
\)
· 165 -
Упражнение 7-3.
Напишите программу сравнения двух файлов, которая будет
печатать первую строку и позицию символа, где они различают-
ся.
Упражнение 7-4.
Переделайте программу поиска заданной комбинации симво-
лов из главы 5 таким образом, чтобы в качестве ввода исполь-
зовался набор именованных файлов или, если никакие файлы не
указаны как аргументы, стандартный ввод. Следует ли печатать
имя файла при нахождении подходящей строки?
Упражнение 7-5.
Напишите программу печати набора файлов, которая начина-
ет каждый новый файл с новой страницы и печатает для каждого
файла заголовок и счетчик текущих страниц.
7.9. Несколько разнообразных функций
Стандартная библиотека предоставляет множество разнооб-
разных функций, некоторые из которых оказываются особенно
полезными. Мы уже упоминали функции для работы со строками:
STRLEN, STRCPY, STRCAT и STRCMP. Вот некоторые другие.
7.9.1. Проверка вида символов и преобразования
Некоторые макросы выполняют проверку символов и преобра-
зования:
SALPHA© не 0, если “C” алфавитный символ,
0 - если нет.
SUPPER© Не 0, если “C” буква верхнего регистра,
0 - если нет.
SLOWER© Не 0, если “C” буква нижнего регистра,
0 - если нет.
SDIGIT© Не 0, если “C” цифра,
0 - если нет.
SSPACL© Не 0, если “C” пробел, табуляция
или новая строка, 0 - если нет.
OUPPER© Преобразует “C” в букву верхнего регистра.
OLOWER© Преобразует “C” в букву нижнего регистра.
7.9.2. Функция UNGETC
Стандартная библиотека содержит довольно ограниченную
версию функции UNGETCH, написанной нами в главе 4; она назы-
вается UNGETC. В результате обращения
UNGETC(C,FP)
символ “C” возвращается в файл FP. Позволяется возвращать в
каждый файл только один символ. Функция UNGETC может быть
использована в любой из функций ввода и с макросами типа
SCANF, GETC или GETCHAR.
· 166 -
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев