Основы программирования (947332), страница 34
Текст из файла (страница 34)
Процедура MkDir(dir:string) - создает новый каталог. Строка dir определяет путь и новое имя.9. Процедура RmDir (dinstring) - удаляет каталог с указанным именем.Каталог должен быть пустым.63. Текстовые файлыТекстовый файл - это файл, компонентами которого являются символьные строки переменной длины, заканчивающиеся специальным маркеромконца строки (рис. 6.4).Указатель файлаСтрока 1PI Строка 2 | |Маркер конца файлаСтрока 3[Компонент 4Маркер конца строкиРис. 6.4. Структура текстового файла1966. Файловая система. ФайлыПримечание, Маркер конца строки - это последовательность из двух специальных символов по таблице ASCII «#13, #10». Символ с кодом 13 интерпретируется в компьютере каккоманда установки курсора в начало строки, а символ с кодом 10 - как команда перехода наследующую строку.
Как уже упоминалось ранее, такая комбинация кодов вводится при нажатии клавиши ENTER.Текстовый файл можно открыть для записи, чтения и добавления записей в конец (см. параграф 6.2). Файл, открытый для записи, не может использоваться для чтения и наоборот.
При открытии файла для добавления система проверяет, не был ли файл открыт для чтения или записи, и если такое открытие имело место, то производится сначала закрытие файла, а затем ужеоткрытие для добавления.Текстовые файлы используют для хранения и обработки текстовой информации: символов, строк, символьных массивов. Логические и числовыеданные при записи в текстовые файлы должны преобразовываться в символьные строки.Следует иметь в виду, что при необходимости текстовый файл можетбыть создан или прочитан любым текстовым редактором, в том числе и текстовым редактором, входящим в состав среды Borland Pascal.Для работы с текстовыми файлами используют специальные процедурыи функции.1.
Функция EOLn( [Var J]): boolean - возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки; при отсутствии файловой переменной проверяется стандартный файл INPUT, который обычно связан с клавиатурой.Примечание, Функция EOLn, как и EOF, по-разному работает с дисковыми файлами илогическими устройствами. Для логического устройства невозможно предвидеть, каким будетрезультат чтения очередного символа. Поэтому при работе с логическим устройством функция EOLN возвращает TRUE, если последним считанным символом был символ #13. При работе с диском функция EOLN возвращает TRUE, если следующим считанным символом будет символ #13.2.
Процедура Read( [Var f:text;] vl, v2,... vn) - обеспечивает ввод символов, строк и чисел. Список ввода представляет собой последовательностьиз одной или более переменных типа CHAR, STRFNG, а также любого целого и вещественного типа. При отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT.При вводе значений переменных типа CHAR выполняется чтение одного символа из файла, считанное значение присваивается очередной переменной из списка ввода.
Как уже упоминалось в параграфе 2.6, символы вводятся подряд, а не через пробел, как числа. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будетсимвол #13, а если был достигнут конец файла, то - символ #26.197Часть L Основы алгоритмизации и процедурное программированиеПри вводе переменных типа STRING количество считанных процедуройи помещенных в строку символов равно максимальной длине строки, еслираньше не встретились маркеры конца строки или конца файла, которые встроку не включаются. Символы, выходящие за размер максимальной длиныстроки, отбрасываются. Новое обращение к процедуре Read вернет пустуюстроку (см.
также параграф 2.6). Следовательно, процедура Read не в состоянии читать последовательность строк, так как первая строка будет прочитана правильно, а все последующие окажутся пустыми.При вводе числовых данных процедура Read пропускает все пробелы,знаки табуляции и маркеры до первого значащего символа и читает строку допробела, знака табуляции или маркера.
Полученная подстрока преобразуетсяиз символьного во внутреннее представление в соответствии с типом значения и присваивается следующей переменной из списка. Если нарушен формат, то фиксируется ошибка ввода-вывода. Если достигнут маркер концафайла, то переменной присваивается значение О, причем никаких сообщенийв этом случае не выдается.Ввод логических констант процедурами Read и ReadLn не предусмотрен.Чтение с клавиатуры осуществляется через буфер, который передаетсяпроцедуре при нажатии клавиши ENTER и имеет размер 127 байт, поэтомуввести с клавиатуры строку большего размера нельзя.3. Процедура ReadLn( [Var f;] vl,v2, ,..,vn ) - также обеспечивает вводсимволов, строк и чисел. Процедура использует те же правила ввода, что ипроцедура Read, но после чтения последней переменной оставшаяся частьстроки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки.
Процедура может быть вызвана без указания списка ввода, что приведет к пропускувсех символов текущей строки до маркера конца строки.Процедуры Read и ReadLn могут использоваться без указания файловойпеременной. Тогда операция чтения осуществляется из стандартного файлаINPUT. Использование процедуры ReadLn без параметров после процедурыRead приведет к очистке буфера ввода. Применение этой же процедуры безпредшествующей ей процедуры Read переводит программу в состояние ввода, т.е.
выполнение программы приостанавливается до нажатия клавишиENTER, что может использоваться для организации паузы на время просмотра содержимого экрана.4. Процедура Write( [Var /•] v7,v2, ...,vn ) - обеспечивает вывод данныхв текстовый файл или передачу их на логическое устройство. Список вывода - последовательность из одного или более выражений типа CHAR,STRING, BOOLEAN, а также целого или вещественного типов. При выводечисловых значений последние преобразуются в символьное представление.При отсутствии файловой переменной вывод осуществляется в стандартныйфайл OUTPUT, который обычно назначен на экран.1986.
Файловая система. ФайлыЛюбой параметр из списка вывода может иметь формат:<параметр> [: <целое1> [: < целое2> ]],где <целое1> и <целое2> интерпретируются в соответствии с правилами,описанными в параграфе 2.6.5. Процедура WriteLn( [Var /;] vl,v2, ...,vn ) ~ обеспечивает вывод информации в текстовый файл или ее передачу на логическое устройство вывода. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно связан с дисплеем.Процедура полностью идентична процедуре Write, за исключением того, что выводимая строка символов завершается символами #13 и #10. Привызове WriteLn допускается опускать список вывода, в этом случае в файлпередается маркер конца строки (при выводе на экран это приведет к переводу курсора в начало следующей строки).6.
Функция SeekEOLn( [Var /] ):boolean - пропускает все пробелы изнаки табуляции до маркера конца строки или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная не указана, то функция проверяет стандартный файл INPUT.7. Функция SeekEOF( [Var /]):boolean - пропускает все пробелы, знаки табуляции и маркеры конца строки до маркера конца файла или до первого значащего символа и возвращает TRUE при обнаружении маркера. Еслифайловая переменная отсутствует, то функция проверяет стандартный файлINPUTРассмотрим несколько примеров.Пример 6.1.
Разработать программу, которая формирует текстовыйфайл из 26 строк, содержащих случайное количество соответствующих прописных букв латинского алфавита, например:АААААВВВВВСDDDDDDDDDDDDDDDDDDDDDЕЕЕЕЕЕЕЕЕЕЕЕЕЕ и т.д.Program formjextjile;Varfitext;{файловая переменная для текстового файла}а:char; n,i:integer; fname,st:string[30];BeginWriteLnCВведите имя файла'); ReadLn(fiiame);Assign(f/name);{инициализируем файловую переменную}ReWrite(f);{открываем файл для записи}Randomize;{инициализируем датчик случайных чисел}199Часть 1. Основы алгоритмизации и процедурное программированиеfor а:='А' to 'Z' dobegin{формируем строки}n:=Random(30)+l:for i:=l to n do st:=st+a:WriteLn(fySt); {записываем строку в текстовый файл}WriteLn{st);{для контроля - выводим ее на экран}end;Close(f); {закрываем файл}End,Поскольку компоненты текстового файла могут иметь различную длину,возможна только последовательная их обработка (запись, чтение и поиск).Любой вид модификации файла, кроме добавления записей в конец, выполняется с перезаписью информации в другой файл.
Так, для того чтобы исключить некоторую запись, необходимо переписать все строки, кроме подлежащей исключению, в другой текстовый файл. При этом обычно старыйфайл удаляют, новый - переименовывают, присваивая ему имя исходногофайла, и файловую переменную связывают с измененным файлом.Пример 6.2. Разработать программу, которая удаляет из текстового файла «пустые» строки: строки, не содержащие символов, и строки, содержащиетолько пробелы и знаки табуляции.Поскольку в результате обработки часть строк текстового файла будетудалена, нам потребуется создать специальный файл, куда будут помещенынепустые строки файла.Program ex;VarflJ2:text;{файловые переменные текстовых файлов}st.name: string;BeginWriteLnCВведите имя файла:'); ReadLn(name);Assign(fl,name); {инициализируем файловую переменную}{$!'}{проверяем существование файла}Reset(fl);{$ЩifIOResult=0 then {если файл с заданным именем существует}beginAssign(f2/temp.dat');{инициализируем новый файл}Rewrite(f2);{открываем новый файл для записи}while not EOF(fl) do {пока не достигнут конец файла}beginif SeekEOLn(fl) then ReadLn(flySt) {если строка пустая,то пропускаем ее}2006.
Файловая система. ФайлыelsebeginReadLn(fl,st);{читаем строку}WriteLn(f2,st); {записываем ее в новый файл}end;end;Close(fl);{закрываем старый файл}Close(f2); {закрываем новый файл}Erase(fl);{удаляем старый файл}ReName(f2,name); {переименовываем новый файл}endelse WnteLn('0au/i с таким именем не найден.*);EndЗадания для самопроверкиЗадание 1. Дан текстовый файл, состоящий из символьных строк, представляющих собой совокупность слов, разделенных пробелами. Разработайте программу,которая переформирует файл, заменяя в каждой строке сочетание «это» на сочетание«то», и удаляя слова, начинающиеся с символа #.
Вывести на экран скорректированный файл.Задание 2. Разработайте программу, которая осуществляет поиск в текстовомфайле заданных слов. Слова последовательно вводятся с клавиатуры. Для каждогослова должно определяться количество вхождений и номера строк текста. Если указанные слова в файле отсутствуют, то программа должна выводить соответствующеесообщение.6.4. Типизированные файлыТипизированный файл - это файл, все компоненты которого одного типа,заданного при объявлении файловой переменной (рис.