Обработка ошибок - STDERR и EXIT

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

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 -

 


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх