Форматирование текстового файла Применение алгоритма работы с текстовыми файлами больших размеров, страница 3

Если в строке первые два пробелы, а третий – не пробел, или последние два символа пробелы, а стоящий перед ними – не пробел, то значит, разорвался абзац. В этом случае функция возвращает единицу, которая прибавляется к общему количеству абзацев.

Функция int prov_mid_word(char*,int, FILE);

Предназначена для проверки, нарушена ли целостность термина. В функцию передаются три параметра – строка, в которой встречен разорванный термин, длина этой строки и указатель на файл, из которого произведено считывание.

Локальная переменная int y – счетчик цикла.

Функция анализирует, был ли разорван термин. Если последние символы строки – прописные, то значит, был разорван. В этом случае старая строка затирается, указатель в файле позиционируется туда, откуда строка была считана, предварительно уменьшив размерность буфера для чтения, и вновь читает строку. После этого функция рекурсивно вызывает саму себя. И все указанные действия повторяются до тех пор, пока термин не уйдет за пределы строки. В этом случае разрыв исключается, а следующее чтение из файла начинается с этого термина (так как указатель в файле стоит после считанной строки). В конце функция возвращает получившуюся длину строки.

Функция bool term_here(int, char*);

Функция проверяет, впервые указанный термин встречается или он уже сохранен.

Передаваемые параметры: int – количество сохраненных терминов, char* - строка, содержащая еще непроверенный термин.

В ходе вызова функции анализируется, сколько терминов уже сохранено. Если нет ни одного, то функция возвращает false – совпадений нет. Если какие-либо термины уже сохранены, то идет проход по массиву терминов снизу вверх, и если данный совпал с каким-то из сохраненных, то функция возвращает true – совпадение обнаружено. Если после прохода ни одного совпадения обнаружено не было, функция возвращает false – совпадений нет.

Функция void sort(int);

Функция сортирует термины в прямом или обратном (в зависимости от желания пользователя) порядке. Передаваемый в функцию параметр: int – количество сохраненных терминов.

Локальные параметры:

Int r – счетчик цикла (номер текущего термина)

Char q – анализатор нажатой клавиши.

Termin w – вспомогательная структура, предназначенная для обмена элементов по методу «трех стаканов».

Функция при вызове запрашивает способ сортировки: по возрастанию или по убыванию. Если нажата клавиша ‘1’ – по возрастанию, если ‘2’ – по убыванию. Если нажато что-то третье, сортировки не будет.

Внешний цикл выполняется от первого термина и пока они не закончатся. Внутренний цикл выполняется со следующей после текущей позиции и до окончания терминов. Во внутреннем цикле проверяется условие: если первый термин больше второго и при этом была нажата клавиша ‘1’ (два условия для сортировки по возрастанию) или если первый термин меньше второго и при этом была нажата клавиша ‘2’ (два условия для сортировки по убыванию), то происходит обмену по методу «трех стаканов» и циклы продолжаются.

Функция to_file(int)

Функция записывает полученную отсортированные структуры в файл. Формальный параметр: int – количество терминов.

Локальные переменные:

Int r – счетчик цикла (номер текущего термина)

FILE *fp – файловая переменная файла для записи

Сначала открывается (или создается, если не существует) файл для записи. Цикл – пока не закончатся термины. В цикле: в файл записывается очередной термин. Указатель в файле позиционируется на 20 символов от начала строки, в которую был записан данный термин (вне зависимости от длины строки). В файл записывается номер абзаца и символ перевода каретки. Таким образом, в файле все номера абзацев хранятся столбиком. После этого осуществляется запись следующего термина по аналогичному образцу.

Описание работы программы на контрольном примере