Скачиваний:
56
Добавлен:
04.03.2014
Размер:
98.82 Кб
Скачать

Перегрузка операций ввода-вывода

Для перегрузки стандартных операций ввода-вывода в программе BOUND целесообразно предусмотреть 4 прикладные функции: textopen, getbuf, putbuf и closetext. Единственным параметром каждой из них является указатель на структуру FORMBUF. Исходный код этих функций должен предусматривать вызов библиотечных функций буферизованного ввода-вывода, прототипы которых декларирует заголовочный файл <stdio.h> системы программирования C.

Прикладная функция textopen должна вызываться в основной функции main после разбора аргументов командной строки вызова программы BOUND с целью открыть потоки ввода строк из файла исходного текста и вывода строк в результирующий файл типографического текста. Чтобы открыть указанные потоки ввода-вывода, в ее исходном коде должно быть специфицировано обращений к библиотечной функции fopen. Имена файлов, для обработки которых открываются потоки ввода-вывода, должны быть доступны через поля inbuf и outbuf структуры буферов FORMBUF, где они сохраняются при разборе аргументов командной строки.

При этом файл, содержащий исходный текст должен быть открыт в режиме чтения, а результирующий файл для сохранения форматированного текста должен быть открыт в режиме записи. Если любой из указанных файлов не может быть открыт в требуемом режиме доступа, то функция textopen должна возвращать значение системной переменной errno, содержащей код ошибки, в основную функцию main, которая через оператор return передает его в операционную среду вызова программы BOUND, блокируя ее дальнейшее выполнение. Для визуальной диагностики ошибок в функции textopen должен быть предусмотрен вызов библиотечной функции perror, которой передается имя соответствующего файла. Если оба файла успешно открыты, то указатели их потоков сохраняются в соответствующих полях структуры FORMBUF и могут быть использованы для реализации буферизованного ввода-вывода в других функциях этой группы, а функция textopen завершается с нулевым кодом возврата.

Прикладная функция getbuf должна выполнять операцию буферизованного ввода строк из файла исходного текста через поток ввода путем обращения к библиотечной функции fgets. Предельную длину получаемых строк в ней должно ограничивать значение макроопределения BUFSIZ из заголовочного файла <stdio.h> системы программирования C. Для получения очередной строки исходного текста должно быть адресовано поле inbuf структуры буферов FORMBUF, представляющее входной буфер алгоритма форматирования. Для идентификации потока ввода используется поле указателя потока fpin также из структуры FORMBUF. Прикладная функция getbuf должна вызываться во внешнем цикле алгоритма форматирования и возвращать адрес входного буфера или значение нулевого указателя NULL для идентификации конца файла исходного текста.

Прикладная функция putbuf должна обеспечивать буферизованный вывод в поток записи результирующего типографического текста строки, полученной в выходном буфере алгоритма форматирования. Для реализации вывода должна применяться библиотечная функция fputs. Ее аргументы должны адресовать буферное поле outbuf, представляющее выходной буфер алгоритма форматирования, и поле указателя потока вывода fpout структуры FORMBUF. Функция putbuf должна вызываться в циклах алгоритма форматирования, когда заполнен выходной буфер. Ее код возврата должен быть равен нулю. Нулевой код возврата этой функции можно использовать для инициализации длины и содержимого промежуточного буфера алгоритма форматирования.

Прикладная функция closetext должна закрывать потоки обработки файлов, содержащих исходный и результирующий типографический текст, освобождая указатели потоков fpin и fpout в структуре FORMBUF. Для выполнения этих действий следует использовать библиотечную функцию fclose. Прикладная функция closetext должна быть вызвана в основной функции main перед завершением работы программы BOUND. Ее код возврата должен быть равен нулю и передаваться оператору return, который завершает спецификацию основной функции main программы BOUND.

Соседние файлы в папке Инфа - бесценно