Министерствообразования Азербайджанской Республики
БакинскийГосударственный Университет
Факультет: ПрикладнаяМатематика и Кибернетика
Специальность:Экономическая кибернетика
Курс: I курс
Группа: ЭК-24
КУРСОВАЯ РАБОТА НАТЕМУ
«ОБРАБОТКА ТЕКСТОВЫХФАЙЛОВ НА ЯЗЫКЕ ПАСКАЛЬ»
Кафедра: Экономическаяинформатика
Студент: Шарифов Р. Э.
Руководитель: Зав.кафедрой проф. Пашаев Р.Т.
Баку — 2005
ОБРАБОТКАТЕКСТОВЫХ ФАЙЛОВ
Прежде чем перейти к обработке текстовыхфайлов на языке Pascal следует разобраться с понятием файл. На языке Pascalфайл представляет собой упорядоченную последовательностьэлементов. И в отличие от общепринятого понятия файлом на языке Pascal можетбыть не только информация хранящиеся на дисках но и внешние устройства (такие как: дисплей, клавиатура, принтер, любой порт ЭВМ ит.д.).
Теперь рассмотрим причину использованияфайлового типа данных при разработке программ. Введение файлового типа в языкPascal вызвано необходимостью обеспечить возможность работы с периферийными(внешними) устройствами ЭВМ, предназначенными для ввода, вывода и храненияданных. Общее свойствомассива, множества и записи заключается в том, что количество их компонентовопределено на этапе написания программы (то есть в исходном тексте программы),тогда как количество компонентов файла в исходном тексте программы неопределяется и может быть произвольным. Это обстоятельство позволяет оперативноизменять, к примеру, входные данные независимо от программы.
Принцип работы с файлами заключается ввводе и выводе данных. Операция ввода означает перепись данных из входногофайла в основную память ЭВМ, а операция вывода это пересылка данных из основнойпамяти ЭВМ на выходной файл.
Файлы расположенные на внешних устройствахчасто называют физическими файлами. Их имена определяются операционнойсистемой. В программах на языке Pascal имена файлов задаются с помощью строк.Например, имя файла на диске может иметь вид:
‘[имядиска]:[каталог][подкаталог]...[подкаталог][имя файла с расширением]’
Операционная система MS-DOS ограничиваетэту строку до 79 символов. Даже в одноименном модуле DOS языка Pascal имеетсятип данных PathSTR = String[79], то есть строка, максимальная длина которой 79символов. Если же файл находится в том же каталоге, что и программа то имяфайла можно указать короче: ‘[имя файла с расширением]’. Также именами файловмогут быть и имена внешних устройств:
‘CON’, 'LPT1', ‘LPT2’, ‘LPT3’, 'PRN', 'COM1', 'AUX', 'NUL'.
Отмечу что, здесь CON – совокупностьустройств ввода-вывода, где устройство ввода клавиатура, а устройство выводадисплей; 'LPT1', ‘LPT2’, ‘LPT3’ – последовательность устройств дляпечати и ‘LPT1’ синонимичен с 'PRN' и является обыкновенным принтером; 'COM1' –это последовательный порт ЭВМ и т.д.
С файловой системой в Turbo Pascal связанопонятие буфера ввода — вывода. Ввод и вывод данных осуществляется через буфер.Буфер — это область в памяти, которая выделяется для каждого файла. При записив файл вся информация сначала направляется в буфер и там накапливается до техпор, пока весь объем буфера не будет заполнен. Только после этого или послеспециальной команды сброса происходит передача данных на внешнее устройство.При чтении из файла данные вначале считываются в буфер, причем данныхсчитывается не столько, сколько запрашивается, а сколько поместится в буфер.Механизм буферизации позволяет более быстро и эффективно обмениватьсяинформацией с внешними устройствами.
Теперь перейдем к переменным файловоготипа. Язык Pascal поддерживает 3 файловых типа:
-1-ый – текстовые файлы.
-2-ой– типизированные файлы.
-3-ий– нетипизированные файлы.
Описание переменных к этим трем файловымтипам данных выглядит следующим образом:
-для текстовых файлов: Var T:Text;{T-файловая переменная текстового типа}
-для типизированных файлов: Var F:File ofтип_данных; {F-типизированная файловая переменная; тип_данных – любой типданных языка Pascal кроме файлового типа}
-для нетипизированных файлов: Var F:File;{F-нетипизированная файловая переменная}
Файловые переменные, которые описаны впрограмме, называют логическими файлами. Все основные процедуры и функции,обеспечивающие ввод — вывод данных, работают только с логическими файлами.Физический файл должен быть связан с логическим для выполнения определённыхдействий над ним. В последствие будут изложены стандартные функции и процедурыдля работы с файлами и в особенности для обработки текстовых файлов.
Особоеместо на языке Pascal занимают текстовые файлы, которые являются темойнастоящей курсовой работы. Текстовый файл представляет собой линейнуюпоследовательность символов,организованных в строки переменной длины.
В конце строк стоит признак конца строкиEOln (в операционной системе MS-DOS, а как следствие и в её оболочке MS-WindowsEnd Of Line состоит из двух символов: LF- перевод строки, имеющий порядковыйномер в ASCII таблице #10 и CR — возврат каретки c порядковым номером в ASCIIтаблице #13). В самом конце текстового файля стоит признак конца файла EOF (EndOf File имеющий порядковый номер в ASCII таблице -#26). Признак конца строкивводится при помощи нажатия клавиши Enter, а признак конца файла при помощинажатия клавиш Ctrl+Z. Обычно эти специальные символы или признаки неотображаются в текстовых редакторах.
В текстовом файле всегда имеется такназываемый курсор или указатель который стоит на определенном символе. Еслифайл пустой то первым и единственным считанным символом будет EOF (#26).
Помимо текстовых переменных вводимыхпрограммистом но языке Pascal имеются также стандартные файловые переменныетекстового типа: Input и Output. Стандартная текстовая переменная Inputпредставляет собой доступный только для чтения файл, связанный со стандартнымфайлом ввода операционной системы. Стандартная текстовая переменная Output –это доступный только для записи файл, связанный со стандартным файлом вывода.Обычно стандартным файлом ввода-вывода является внешнее устройство – Консоль(‘CON’) о котором уже говорилось выше.
В чем же суть обработки текстовых файлов?Учитывая специфику слова “обработка”, под обработкой текстовых файлов можнопонять считывание информации со входного файла, изменение информации и записиэтой информации на выходной файл. Запись не читанных со входного файлатекстовых данных на выходной файл является видоизменением текстового файла, ноне подпадает под понятие обработка текстового файла.
Теперь самое время перейти к стандартнымфункциям и процедурам, которые Pascalпредоставляет нам дляработы с текстовыми файлами и в некоторых случаях с файлами вообще.
ПроцедураAssign([файловаяпеременная],[имя файла]);
Для работы с файлами вторым важнымдействием после объявления файловой переменной является “связывание” этой переменнойс физическим файлом. Это действие и выполняет процедура Assign.То есть выполняя действия надфайловой переменной программа, ассоциирующая файловую переменную с конкретнымфизическим файлом, производит операции именно над этим физическим файлом. Какбыло отмечено процедура Assignявляется обязательной для работы с файлами. С одним и тем же физическимфайлом можно связать несколько файловых переменных. Также с одной файловойпеременной можно последовательно связать различные физические файлы. Причём припоследовательном связывании с одной и той же переменной различных физическихфайлов операции произведённые над переменной до связывания становятсянедействительными. Например следует дважды открыть одну и ту же переменнуюдважды связанную с различными файлами для чтения: Assign(T,’file1.txt); Reset(T); Assign(T,’file2.txt’); Reset(T);. О процедурах открытия файловбудет говориться ниже.
Что касается стандартных входных ивыходных текстовых файлов Inputи Outputто они автоматическисвязываются со стандартным устройством ввода-вывода (обычно это совокупностьустройств – дисплей и клавиатура). То есть два оператора Assign(Input,’CON’); Assign(Output,’CON’); выполняются по умолчанию и их неследует писать.
Приведём пример программы использующейпроцедуру Assign:
Program Assign_my_file;
Var T:Text; {Описание текстовой переменной}
Begin
Assign(T,’my_file.txt’); {Сопоставление внешнемутекстовому файлу my_file.txt текстовой переменной T}
End.
ПроцедураAssign работаетсо всеми типами файлов.
ПроцедураReset([файловаяпеременная]);
Открывает логический файл (то есть файловаяпеременная связанная с физическим файлом) для чтения. Естественно, что длячтения следует открывать входной файл. После выполнения процедуры Reset курсор ставится на первый элементфайла (в случае текстового файла на первый символ) и с файла уже можносчитывать информацию. Если текстовый файл пустой, то первым символом будет EOF- #26.
Приведём пример программы использующейпроцедуру Reset:
Program Reset_my_file;
Var T:Text;
Begin
Assign(T,’my_file.txt’);
Reset(T); {Открытие файла для чтения}
End.
Что касается стандартного входного текстовогофайла Inputто он открывается для чтения автоматически. То есть не следует писать Reset(Input);в программе.
Процедура Rewrite([файловая переменная]);
Создает и открывает внешний физический файлсвязанный с файловой переменной для последующей записи в него. Новый созданныйфайл бывает пустой и курсор становится в самое начало файла. Если описанный впроцедуре Assignвнешний файл уже существует, то он стирается и создаётся заново. Разумеетсяпосле выполнения процедуры Rewriteсозданный для записи файл является выходным файлом. Процедура Rewrite используется со всеми файловымитипами данных.
Приведёмпример программы использующей процедуру Rewrite:
Program Rewrite_my_file;
Var T:Text;
Begin
Assign(T,’my_file.txt’);
Rewrite(T); {создаёт новый файл my_file.txt для последующей записи в него}
End.
Что касается стандартного выходноготекстового файла Outputто он открывается для записи автоматически. То есть не следует писать Rewrite(Output); в программе.
ПроцедураAppend([файловаяпеременная]);
Открывает внешний физический текстовыйфайл связанный с файловой переменной для последующей записи в него. Однако вотличии от процедуры Rewriteэтот файл существует запись производится в самый конец файла. Разумеетсяпроцедура Appendиспользуется для открытия выходных текстовых файлов. После открытия файлакурсор становится в самый конец файла. Процедура Append используется только для текстовыхфайлов.
Приведём пример программы использующейпроцедуру Append:
Program Append_my_file;
Var T:Text;
Begin
Assign(T,’my_file.txt’);
Append(T); {Открывает логический файл дляпоследующей записи информации в самый конец}
End.
ПроцедураClose([файловаяпеременная]);
Сохраняет и закрывает открытый физическийфайл связанный с файловой переменной. Как было отмечено в определении файлперед закрытием должен быть открыт (процедурами Reset или Rewrite для всех типов файлов илипроцедурой Appendдля текстовых файлов). Если в выходных файлах были произведены изменения, тодля сохранения информации они должны быть обязательно закрыты процедурой Close. Процедура Close может быть использована для любыхтипов файлов. Если последовательно открывать файл различными процедурами, то впромежутках между этими процедурами оператор Close автоматически. То есть если вначале открыть файл для записи процедурой Rewrite а затем сразу открыть его длячтения процедурой Reset,то до процедуры Resetавтоматически произойдёт сохранение и закрытие файла оператором Close.
Приведём пример программыиспользующей процедуру Close:
Program Close_my_file;
Var T:Text;
Begin
Assign(T,’my_file.txt’);
Append(T);
Close(T); {Сохраняем и закрываем текстовыйфайл Tоткрытый процедурой Append}
End.
ПроцедураErase([файловаяпеременная]);
Процедура Erase удаляет физический файл связанный сфайловой переменной. Физический файл связанный с файловой переменной долженсуществовать, иначе при попытке удалить несуществующий файл процедурой Erase произойдёт ошибка времени.
Приведёмпример программы использующей процедуру Erase:
ProgramErase_my_file;
Var T:Text;
Begin
Assign(T,’my_file.txt’);
Rewrite(T);
Erase(T); {Удаляем файлmy_file.txt}
End.
Процедура Read([файловая переменная],[списокввода]);
Присваивает одно или несколько значенийиз файла связанного с файловой переменной в одну или несколько переменных,описанных в списке ввода. В списке ввода могут быть одна переменная илиперечислены несколько переменных через запятую. Переменные для ввода изтекстового файла могут быть следующих типов:
-Символьный тип данных (Char).
-Строковой тип данных (String).
-Целочисленный тип данных (Integer, LongInt, Word, Byte).
-Переменные вещественного типа (Real,Single, Double, Complex, Extended).
Считываниеинформации из входного файла процедурой Read всегда происходит толькопоследовательно. Так как при считывании текущая позиция перемещается кследующему символу.
Теперь рассмотрим как процедура Read присваивает значения различнымтипам данных.
1)Символьный тип. При вводе переменныхтипа Charвыполняется чтение одного символа из файла и присваивание считанного значенияпеременной. Если перед выполнением чтения указатель достиг конца очереднойстроки, то результатом чтения будет символ CR (ASCII код #13), а если достигнут конецфайла, то — символ EOF( код #26).
2)При вводе переменных типа String количество считанных процедурой иприсвоенных строке символов равно максимальной длине строки, если только раньшене встретились символы CRи EOF. В этомслучае сами символы CRи EOF в строку непомещаются. Если количество символов во входном потоке данных большемаксимальной длины строки, “лишние” символы до маркера конца строки или файлаотбрасываются, а новое обращение к Read возвращает пустую строку. Такимобразом, процедура Readне в состоянии прочесть последовательность строк из текстового файла: строкипрочитанные до маркеров конца строки или файла будут нормальными а послемаркеров будут пустыми.
3,4)При вводе числовых переменных процедураRead вначалевыделяет подстроку во входном потоке по следующем правилу: все ведущие пробелы,символы табуляции и маркеры конца строк EOLn пропускаются, после выделенияпервого значащего символа, наоборот, любой из перечисленных символов или EOF служат признаком конца подстроки.Выделенная таким образом подстрока затем рассматривается как символьноепредставление числовой константы соответствующего типа и преобразуется вчисленное представление, а полученное значение присваивается числовойпеременной. Если в подстроке был нарушен требуемый формат представления численнойконстанты, возникает ошибка ввода. Если при пропуске ведущих пробеловвстретился символ EOF,переменная получает значение 0. В Турбо Паскале не предусмотрен вводшестнадцатеричных констант.
Отмечу что, ввод переменных типа Boolean процедурами ввода не предусмотрен.
Что касается стандартных текстовыхпеременных, то при использовании процедуры Read применительно к стандартномувходному файлу Input,т.е. при вводе с клавиатуры, символьные строки запоминаются в буфере, которыйпередается процедуре только после нажатия на клавишу Enter. Кроме того, при работе с файлом Input в записи оператора Read не надо писать имя файла, иначе этоприведет к ошибке. Это позволяет редактировать данные при их вводе.Максимальная длина буфера ввода при работе с клавиатурой составляет 127символов. Ввод с клавиатуры по процедуре Read сопровождается эхо-повторомвводимых символов на экране ПК.
Процедура Read прекрасно приспособлена вводучисел. При обращении к ней за вводом очередного целого или вещественного числапроцедура «перескакивает» маркеры конца строк, т.е. фактически весь файлрассматривается ею как одна длинная строка, содержащая текстовое представлениечисел.
Приведем пример программы, использующейпроцедуру Read:
Допустимнам дан входной файл my_file.txt следующего вида:
Sharifov Rustam 1987
ProgramRead_from_file;
Var
F,I:string[15]; {Переменная F – фамилия, I – имя. Во входном файле фамилия иимя последовательно расположены на 15 позициях, то есть на них выделено 15позиций}
D:word;{Переменная D– год рождения. Год рождения расположен сразу после имени}
T:Text;
Begin
Assign(T,’my_file.txt’);
Reset(T);
Read(T,F,I,D); {Из входного файла Т считываютсяданные и присваиваются переменным.}
End.
Процедура ReadLn([файловая переменная],[списокввода]);
Это процедура идентична процедуре Read (она также присваивает переменным, перечисленным в списке вводазначения, считанные из текстового файла), за исключением того, что послесчитывания последней переменной оставшаяся часть строки до маркера Eoln пропускается. Поэтому следующееобращение к ReadLnили
Read начинается с первого символа новойстроки. Кроме этого, эту процедуру можно вызывать без параметра [список ввода], что приведет к пропуску всех символовтекущей строки вплоть до Eoln.Процедура ReadLnиспользуется только стекстовыми файлами.
Если процедура используется для чтенияс клавиатуры (Input),нажатие на клавишу Enterотобразится на экране как последовательность CR + LF и курсор будет помещен в началоследующей строки. В то время как впроцедуре Read эхо-повтором клавишы Enter является символ CR.
Допустим нам дан входной файл my_file.txt следующего вида:
Sharifov
Rustam
1987
ProgramRead_from_file;
Var
F,I:string[15];
D:word;
T:Text;
Begin
Assign(T,’my_file.txt’);
Reset(T);
ReadLn(T,F,I,D); {Данные во входном файлесоответсвующие переменных расположены в новых строках. Процедура каждый разсчитывает данные из новой строки и перемещает курсор за признак конца строки EOLn }
End.
ПроцедураWrite([файловаяпеременная],[список вывода]);
Обеспечивает вывод информации в текстовыйфайл или передачу её на логическое устройство. Файловая переменная должна бытьсвязана с внешним файлом для вывода информации. Если файловая переменнаяотсутствует, то подразумевается вывод информации на стандартное устройствовывода (дисплей ПК). Здесь [список вывода]: последовательность из одного илиболее выражений типа:
-Символьный тип (Char)
-Строковой тип (String)
-Целые числа
-Вещественные числа
-Булевые константы (Boolean)
Элементы списка вывода разделяются друг от другазапятой.Любой элемент списка вывода может иметь вид:
Выводимое_выражение[: ширинаполя[: кол-во десятичных знаков]]
[ширинаполя] и [количество десятичных знаков] – это выражения типа Word. Квадратные скобки означают возможностьотсутствия заключенных в них параметров. Подпараметр [ширина поля], если онприсутствует, указывает минимальную ширину поля, в которое будет записыватьсясимвольное представление выводимого значения. Именно символьное представление,так как все данные перечисленные в списке вывода переводиться в символьный типи только п