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

Когда сортировка завершена, термины и номера абзацев отправляются в файл. Запись производится следующим образом: сначала записывается термин, затем, в зависимости от его длины курсор позиционируется на начало термина, а потом на 20 символов левее. Это сделано для того чтобы все номера абзацев в файле стояли друг под другом, вне зависимости от длины термина. Затем записывается номер абзаца, файловый указатель переводится на следующую строку. Запись продолжается до тех пор, пока не закончатся элементы структуры.

Функциональное описание

Функция int work_with_file();

Предназначена для чтения из неформатированного файла текста и выделения из него терминов с указанием номера абзаца, в котором он был впервые встречен. Функция имеет ряд локальных переменных:

int i – счетчик цикла

int k – счетчик количества букв в считываемом слове

int ch – счетчик количества абзацев в тексте

int web – счетчик количества терминов в тексте

int lok – переменная, определяющая длину считываемой строки

bool ind – индикатор того, что слово состоит только из заглавных букв (ind = = true)

bool ypa – индикатор того, что такой термин уже присутствует и считан (ypa = = true)

FILE *fp – файловая переменная открытого для чтения файла

char s[80]="" – считанная из файла строка

char c[60]="" – переменная для хранения слов (как терминов, так и нет)

Первоначально производится открытие файла. Если файл не существует или не открылся, программа прекращает работу. Если открытие прошло успешно, начинается процесс считывания из файла до тех пор, пока он не кончится. Считав строку из файла, программа производит вызов функции prov_mid_abc() – проверить, не нарушена ли целостность «трех пробелов». Если нарушена, то число абзацев увеличивается. Далее следует проверка на нарушении целостности терминов. Если целостность нарушена, строка уменьшается в размере. Конечная длина передается в переменную lok, которая, в свою очередь, является конечным условием для следующего за ней цикла for (цикл движения по строке до конца).

Далее производится анализ символов строки. Если встречены три пробела подряд, значит, идентификатор количества абзацев увеличивается на единицу. Если найдено начало слова (переход с на другой символ), производится запись в переменную c очередного слова, пока не дойдем до его конца (при этом учитывается, что слово может стоять как в середине предложения (после него – пробел, закрывающаяся скобка или запятая), в конце (после него – точка, восклицательный или вопросительный знак) и в конце считанной строки (после него – символ двоичного нуля ‘\0’). Считав слово, начинаем проверять, только ли из заглавных букв оно состоит. Если есть строчные, запись не производится, и цикл идет дальше по строке. Если строчных нет, проверяется, не является ли слово предлогом или союзом, стоящим в начале предложения и состоящим из одной буквы. Так как предлоги и союзы терминами не являются, то они отбрасываются. Идет движение по строке вперед. Если слово все же оказалось термином, идет проверка, не встречалось ли оно ранее в тексте. Если встречалось, оно не заносится в структуру. Цикл продолжается.

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

Функция int prov_mid_abc(char*);

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