Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кетков.doc
Скачиваний:
17
Добавлен:
27.09.2019
Размер:
2.22 Mб
Скачать

11.5.15. Опрос и изменение текущего каталога

Текущий каталог – это каталог, из которого запущена программа. Если файлы используемые программой находятся в текущем каталоге, то во всех файловых процедурах можно указывать только короткое имя файла. Если файл находится в другом каталоге, то приходится задавать полную спецификацию файла. Для сокращения можно изменить имя текущего каталога, чтобы избежать задания полных путей. Система BCB предлагает две функции, с помощью которых можно узнать или изменить имя текущего каталога:

as = GetCurrentDir(); //опрос имени текущего каталога

vb = SetCurrentDir(NameDir); //смена текущего каталога

11.6. Поиск файлов в каталогах

Одной из довольно распространенных процедур является составление списка файлов указанного каталога, имена которых удовлетворяют заданной маске. Под управлением MS-DOS такая задача решается с помощью функций findfirst (найти первый файл) и findnext (найти следующий файл). Обе функции используют в качестве одного из своих аргументов адрес структуры типа ffblk, в которую они заносят информацию о найденном файле:

struct ffblk {

char ff_reserved[21]; //зарезервировано для MS-DOS

char ff_attrib; //байт атрибутов найденного файла

int ff_time; //время создания/модификации файла

int ff_date; //дата создания/модификации файла

long ff_size; //размер файла

char ff_name[13]; //имя найденного файла

};

Описание этой структуры и прототипы указанных функций находятся в заголовочном файле dir.h. Обе функции возвращают нулевое значение, если поиск закончился удачно. Достаточно четкое представление об их использовании дает следующий пример, который выводит на экран список всех файлов с расширением .cpp из каталога c:\bc\bin:

#include <stdio.h>

#include <conio.h>

#include <dir.h>

void main()

{ struct ffblk qq;

int a;

printf("Список файлов *.cpp\n");

a=findfirst("c:\\bc\\bin\\*.cpp",&qq,0); //поиск первого файла

while(!a)

{ printf(" %s\n",qq.ff_name);

a=findnext(&qq); //поиск следующего файла

}

getch();

}

Первый аргумент функции findfirst определяет маску, которой должно удовлетворять имя искомого файла. Третий аргумент этой функции имеет тип int и позволяет фильтровать найденные объекты по любой комбинации их атрибутов в файловой системе (Read Only, Hidden, System, Archive, Volume, Directory). Нулевое значение этого параметра, использованное в примере, игнорирует отбор по атрибутам.

Точно таким же способом можно осуществлять поиск нужных файлов в среде BCB.

Раздел 12. Библиотеки стандартных и нестандартных функций

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

Однако определенные технологии получили свое развитие и в программировании, приблизив его к промышленным методам создания программных продуктов.

В этой связи мы должны вспомнить историю развития одного из мощнейших средств автоматизации программирования – разработку библиотек стандартных программ. В нашей стране в начале 60-х годов прошлого столетия на отечественных ЭВМ типа М-20 в Институте Прикладной математики АН СССР им. акад. М.В. Келдыша была разработана интерпретирующая система ИС-2, которая положила начало созданию библиотек стандартных подпрограмм, а впоследствии и стандартных алгоритмов на алгоритмических языках. Традиция эта была подхвачена журналом Ассоциации вычислительных машин (Communications of the ACM, США), который на протяжении десятков лет публиковал алгоритмы решения математических задач на языках АЛГОЛ-60 и ФОРТРАН. Публикация исходных текстов преследовала не только просветительские цели, читатели находили ошибки в опубликованных алгоритмах, предлагали более эффективные решения. Таким способом на протяжении полутора десятков лет отлаживался и накапливался архив типовых методов решения задач линейной алгебры, дифференциального и интегрального исчислений, решения нелинейных уравнений, статистической обработки данных, вычисления математических функций и т.п. Он составил основу пакета научных программ SSP (Scientific Subroutine Package) на ФОРТРАНЕ, который был взят на вооружение фирмой IBM и стал доступным для пользователей IBM/360, IBM/370. С появлением в нашей стране IBM-совместимых моделей серии ЕС ЭВМ с этим пакетом познакомились и отечественные программисты.

Современные системы программирования на базе ПК, к сожалению, не оценили вычислительные возможности пакета SSP и его расширений. Конечно, они включили в состав своих системных библиотек наиболее распространенные математические функции. Но основу сегодняшних системных библиотек составляют не методы решения математических задач. Начинка системных библиотек в BC и BCB состоит, в основном, из всякого рода сервисных программ, обеспечивающих поддержку некоторых типов данных (строки, множества, комплексная арифметика, дата и время, преобразования типов данных), управление дисплеем в текстовом и графическом режимах, обслуживание интерфейса с другими внешними устройствами и др. Те алгоритмы и программы, которые когда-то входили в состав SSP, теперь распространяются в различных коммерческих продуктах типа MathCAD, MatLab, Statistica, Mathematica и т.п.

12.1. Библиотеки системных функций в Borland C++ 3.1

Библиотеки системы BC 3.1 представлены файлами в каталоге BC\LIB. Там находится примерно 25 файлов с расширениями .lib, около двух десятков файлов с расширениями .obj и три файла с расширениями .c. Для более детального знакомства с этими файлами напомним терминологию, принятую во многих системах программирования:

  • исходный модуль – текстовый файл, содержащий программу на языке программирования. Для систем BC и BCB характерны расширения .c (от названия языка C) и .cpp (от названия языка C-plus-plus);

  • объектный модуль – результат обработки исходного модуля компилятором с алгоритмического языка. Для многих систем программирования файлы объектных модулей имеют расширение .obj (от object – объект). Объектный модуль – это заготовка машинной программы, которая нуждается в настройке, т.к. в работе этого модуля могут потребоваться другие модули и внешние данные;

  • исполняемый модуль – результат сборки и настройки совместно работающих объектных модулей. Это – готовая к работе машинная программа, обычно имеет расширение .exe (от execute – исполнять);

  • библиотечный модуль – совокупность объектных модулей, которая обычно хранится в файле с расширением .lib (от library – библиотека) или .dll (от dynamic-link library – динамически загружаемая библиотека).

Большое количество файлов, находящихся в разделе BC\LIB, объясняется тем, что некоторые библиотеки сформированы в нескольких вариантах для разных моделей памяти. В рамках MS-DOS система BC 3.1 могла создавать программы для шести разных моделей памяти – Tiny (крошечная), Small (малая), Medium (средняя), Compact (компактная), Large (большая) и Huge (огромная). Для каждой из этих моделей использовалось свое распределение памяти в пределах выделенного ресурса, использовалась своя адресация, разные типы указателей (ближние и дальние) и т.п. Поэтому ряд библиотек представлен в шести экземплярах.

Библиотека системных функций BC 3.1 условно разбита на 17 разделов, названия которых представлены в табл. 12.1. В общей сложности в этих разделах хранится порядка 600 функций.

Таблица 12.1

Раздел библиотеки

Число

функций

Пояснение

Classification routines

12

Проверка символов на принадлежность определенной категории

Conversion routines

21

Преобразование типов данных

Directory control routines

31

Работа с дисками и каталогами

Diagnostic routines

3

Программы диагностики

Graphics routines

79

Графические процедуры

Inline routines

16

Встраиваемые функции

Input/Output routines

110

Управление вводом/выводом

Interface routines

75

Обслуживание BIOS

Math routines

88

Математические функции

Memory routines

28

Управление оперативной памятью

Miscellaneous routines

7

Разное (звук, задержка, переходы)

Process control routines

24

Управление процессами и сигналами

Standard routines

30

Стандартные функции

String and memory routines

43

Управление строками и памятью

Text window display routines

20

Управление дисплеем в текстовом режиме

Time and date routines

25

Работа с датой и временем

Variable argument list routines

3

Обслуживание списка аргументов

Для обслуживания библиотек в состав системы программирования входит утилита tlib.exe. Запускается она из командной строки со следующим списком возможных параметров:

>tlib.exe lib_name [/C][/E][/P][/0] commands,listfile

Здесь lib_name – имя библиотечного файла, расширение .lib можно не писать;

[/C][/E][/P][/0] – необязательные ключи режимов работы;

commands – команды по обслуживанию библиотеки;

listfile – список файлов.

Ключи режимов имеют следующий смысл:

/C – в библиотеке предусмотрено различать большие и малые буквы, как это предусмотрено и стандартом языка C (по умолчанию в библиотеках большие и малые буквы не различаются);

/E – в библиотеке будет создан расширенный словарь, который ускорит компоновку программ, использующих объектные модули из библиотеки;

/Pnnnn – в библиотеке будет использован заданный размер "страницы" (в MS-DOS этот размер фиксирован и равен 200h);

/0 – из объектных модулей будут удалены записи с комментариями.

Команды, набираемые в строке, состоят из одного или двух символов, вслед за которыми указывается имя объектного модуля. В имени объектного модуля разрешается опускать расширение .obj. Символ (-ы) перед именем модуля определяет действие, которое должно быть выполнено:

+ добавить модуль к содержимому библиотеки;

– удалить модуль из библиотеки;

* извлечь модуль из библиотеки, сохранив там его копию;

–+ (или +–) заменить прежний модуль в библиотеке новым;

–* (или *–) извлечь модуль и удалить его из библиотеки.

С помощью утилиты tlib.exe можно выдать содержимое библиотеки в указанный файл:

>tlib.exe lib_name,1.txt

По этой команде в текстовом файле 1.txt окажется список всех объектных модулей, находящихся в библиотеке lib_name с указанием их длин и меток входа. Выглядит это примерно так:

Publics by module

ABS size = 14

_abs

ABSREAD size = 292

_absread _abswrite

ACCESS size = 55

_access

ALLOCA size = 50

_alloca