Строковый тип данных – String




1. Строка - это последовательность символов кодовой таблицы персонального компьютера. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. В Pascal строка трактуется как последовательность символов. Для строки из N символов отводится N+1 байт памяти: N байт – для хранения символов строки и один байт – для значения текущей длины строки. К любому символу в строке можно обратиться, указав его номер. В самом начале строки (под нулевым номером) расположен байт, содержащий значение текущей длины строки. Поэтому для определения объема памяти в байтах, требуемой для размещения строки, к значению ее максимальной длины прибавляется 1.

 

 


Рассмотрим структуру размещения строки в памяти на примере. Пусть М – максимальная длина строки, L – текущая длина, А – номер ячейки памяти, с которой начинается размещение строки, тогда:

А – содержит величину текущей длины (нулевой байт);

А+1 – содержит первый символ строки (1-ый байт);

А+L – содержит последний значащий символ (L-ый байт);

A+L+1

… – незанятые ячейки памяти, отведенные под строку.

A+M

2. Для определения строкового типа данных используется зарезервированное слово String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки равна 255 байт. Переменную строкового типа в программе можно объявить двумя способами:

а) через раздел описания типов

Type < имя_типа_ строки> = String [<макс_длина_строки>];

Var <имя_переменной>:< имя_типа_строки>;

б) в разделе описания переменных.

Var <имя_строки>: String[<макс_длина_строки>];

Пример. Type Stroka= String [15];

Var B: Stroka;

Пример. Var B: String[15];

Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка.

Строковые данные могут использоваться в программе также в качестве констант.

Пример.

Const

Address=’Березовая аллея, 25’;

При использовании в выражениях строка заключается в апострофы. Недопустимо применение строковых переменных в качестве селектора в операторе Case.

3. Для присваивания строковой переменной результата строкового выражения используется оператор присваивания.

Пример.

Var Str1, Fio: String[20];

Str1:=’Группа учащихся’;

Fio:=’Бочаров А. А.’;

Если значение переменной после выполнения оператора присваивания превышает по длине максимально допустимую при описании величину, все лишние символы справа отбрасываются.

Пример.

Описание А Выражение Значение А
A: String[6] A: String[8] A: String[2] А:=’ГРУППА 1’; А:=’ГРУППА 1’; А:=’ГРУППА 1’; ’ГРУППА’ ’ГРУППА 1’ ’ГР’

Допускается смешение в одном выражении операндов строкового и символьного типов. Если при этом литерной переменной присваивается значение строкового типа, длина строки должна быть равной 1, иначе возникает ошибка.

4. К отдельным символам строки можно обратиться по индексу данного символа в строки, если рассматривать строку как массив символов. При этом нулевой элемент содержит код реальной длины строки, а элементы, начиная с 1-ого, - символы (отличие от обычных массивов). Индекс определяется выражением целого типа (а также целочисленной константой или переменной), которое записывается в квадратных скобках сразу за именем строковой переменной или константы.

Пример. Пусть Str:=’Алфавит’, тогда Str[1+2] =’ф’, Str[7] =’т’, Str[0] = chr(7) (в Str[0] записан код символа ‘ 7’).

Запись STR[0] дает доступ к нулевому байту, который предназначен для указания реально используемого количества символов строки и может изменяться от символа с кодом 0 (строка не содержит ни одного символа) до символа с кодом N (N – максимальный объявленный размер строки). Т. к. в строке не может быть более 255 символов, то максимальный код, хранящийся в нулевом байте равен chr(255).

5. Выражения, в которых операндами служат строковые данные, называются строковыми. Они состоят из строковых констант, переменных, указателей функций и знаков операций. Над строковыми данными допустимы: операция сцепления или конкатенации (+) и операции отношения (=, <>, >, <, >=, <=).

Операция сцепления применяется для сцепления (объединения) нескольких строк в одну результирующую строку (по принципу поезда).

Пример.

а) Str1:=’Группа учащихся’;

Str2:=’ школы – лицея’;

St:=Str1+ Str2; {St=’Группа учащихся школы - лицея’}

б) Str1:=’Группа учащихся’;

St:=Str1+ ’ школы – лицея’; {St=’Группа учащихся школы - лицея’}

в) Выражение Результат
  ‘А’+ ‘Т’+ ‘386’ ‘Турбо ’+ ‘Паскаль ’+ ‘7.0’ ‘АТ386’ ‘Турбо Паскаль 7.0’

Следует помнить, что длина результирующей строки не должна превышать значения, указанного при ее описании в разделе Var, или 255 байтов (если не указана максимальная длина строки для этой переменной).

Операции отношения проводят сравнение двух строковых операндов и имеют приоритет более низкий, чем операция сцепления, т. е. сначала всегда выполняются все операции сцепления, если они присутствуют, и лишь потом реализуются операции отношения. Сравнение строк производится посимвольно слева направо до первого несовпадающего символа, и та строка считается больше, в которой первый несовпадающий символ имеет больший номер в стандартной таблице обмена информацией. Результат выполнения операций отношения над строковыми операндами всегда имеет логический тип и принимает значение True, если выражение истинно, и False, если ложно. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем более длинная. Строки считаются равными, если полностью совпадают по длине и содержат одни и те же символы.

Пример.

Выражение Результат
‘MS-DOS’ < ‘MS-Dos’ True, т. к. коды заглавной буквы меньше кода строчной
‘program’ > ‘PROGRAM’ True, аналогично
‘Принтер ’ > ‘Принтер’ True, т. к. левый операнд длиннее на 1 символ (пробел в конце)
‘Intel’ = ‘Intel’ True, т. к. строки одной длины и содержат одни и те же символы

6. Для обработки строковых данных можно использовать стандартные процедуры и функции, описание которых можно найти в [1] или в любом справочнике по Pascal.

Задача

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

Program Primer_String; Uses Crt, System; Const Nm: Array[1..12] of String[10]=(‘JANUARY’, ‘JUNE’, ‘JULY’, ‘AUGUST’, ‘SEPTEMBER’, Var Str: String[10]; i: Integer; Month: Boolean; Begin Clrscr; Writeln(‘Введите символы (строку)’); Readln(Str); Month:=False; For i:=1 to Length(Str) Do Str[i]:=Upcase(Str[i]); For i:=1 to 12 Do If Str = Nm[i] Then Month:=True; If Month Then Writeln(‘Введено имя месяца’) Else Writeln(‘Введено не имя месяца’); Readkey; End. {заголовок программы} {System – библиотека осн. функций Pascal} {раздел описания констант} ‘FEBRUARY’, ‘MARCH’, ‘APRIL’, ‘MAY’, ‘OСTOBER’, ‘NOVEMBER’, ‘DECEMBER’); {раздел описания переменных} {строка для ввода символов с клавиатуры} {параметр цикла For} {логическая переменная для записи рез-та} {начало программы} {очистка экрана} {ввод с клавиатуры посл-ти символов} {в строковую переменную Str} {} {преобразование всех символов строки Str} {в прописные буквы} {цикл проверки} {если Str – имя месяца} {то рез-т - истина} {если результат - истина} {то вывод «Введено имя месяца»} {иначе вывод «Введено не имя месяца»} {ожидание нажатия любой клавиши} {конец программы}

Файлы

1. Общие сведения.

Большие объемы (например, телефонный справочник) данных удобно записывать во внешнюю память в виде последовательности символов. Любой язык программирования должен иметь средства для организации хранения информации на внешних запоминающих устройствах и доступа к этой информации. В Pascal для этих целей предусмотрены специальные объекты – файлы. Файлом называется совокупность данных, записанная во внешней памяти под определенным именем. Целесообразность применения файлов продиктована следующими причинами:

- ввод больших объемов данных, подлежащих обработке, утомителен и требует большого времени; удобнее создать отдельный файл, который может быть подготовлен заранее и неоднократно использоваться;

- файл данных может быть подготовлен другой программой, становясь, таким образом, связующим звеном между двумя разными задачами, а также средством связи программы с внешней средой;

- программа, использующая данные из файла, не требует присутствия пользователя в момент фактического исполнения.

Файлы в языке Pascal подразделяются на текстовые файлы, файлы с объявленным типом данных (типизированные файлы), файлы с необъявленным типом данных (нетипизированные файлы). Рассмотрим теорию, относящуюся ко всем видам файлам, а на последующих двух занятиях более подробно будут рассмотрены текстовые и типизированные файлы.

2. Характеристики файла:

а) уникальное имя, что позволяет программе работать одновременно с несколькими файлами;

б) тип компонентов (любой тип данных языка Pascal, кроме файлового) – только для типизированных файлов;

в) длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

3. Описание файлового типа.

Для доступа к файлу в программе должна быть описана специальная файловая переменная, которая считается представителем файлов в программе на Pascal:

Var

<имя_файловой_переменной>: <тип_файла>;

где <тип_файла> - определяется назначением файла, существует три возможных описания типа файлов:

а) для текстовых файлов

Var

<имя_файловой_переменной>: Text;

б) для типизированных файлов

Var

<имя_файловой_переменной>: File of <тип_компонентов>;

 

в) для нетипизированных файлов

Var

<имя_файловой_переменной>: File;

Пример.

Type Stroka=Srtring[15];

Var

F1: File of Integer; {файловая перем. для типиз. файла с целочисленными компонентами}

F2: File of Stroka; {файловая перем. для типиз. файла со строковыми компонентами}

F3: Text; {файловая перем. для текстового файла}

F4: File; {файловая перем. для нетипизированного файла}

4. Действия с файлами.

При использовании файлов в Pascal возможны три способа работы с ними:

- чтение файла с диска;

- запись файла на диск;

- редактирование файла.

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

Под записью файла на диск понимается запись (вывод) данных из оперативной памяти компьютера на диск для хранения и дальнейшего использования этой же или другими программами.

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

5. Доступ к компонентам файла.

Файл представляет собой последовательность байтов, записанных на диске, которую пользователь интерпретирует нужным ему образом, например, как текст или последовательность чисел. Все компоненты файла считаются пронумерованными, начальный компонент имеет нулевой номер. Компонентом файла может быть число (целое или вещественное), символ, строка и т. д. В любой момент времени программе доступен только один компонент файла, на который ссылается текущий указатель (указатель обработки). Часто позицию размещения доступного компонента называют текущей позицией.

Все действия с файлами производятся покомпонентно, причем в этих действиях участвует тот компонент файла, на который указывает текущий указатель. В результате совершения операций чтения/записи указатель может перемещаться по компонентам файла.

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

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

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

6. Основные процедуры работы с файлами (на примере текстового файла).

Пример 1 (написать на доске с комментариями и все процедуры объяснить на этом примере).

Program Primer;

Var F1, F2: Text;

Name: String[30];

Begin

Assign(F1,’TTT.txt’); {установление соответствия между F1 и файлом в текущей папке}

{$I-}

Reset(F1);

{$I+} {открытие файла F1 на чтение}

If Ioresult <> 0

Then Writeln(‘Файл не найден’)

Else …(работа с файлом F1)

Name:=’C:\TP\WORK\Res.dat’; {задание абсолютного имени файла}

Assign(F2, Name); {установление соответствия между F2 и файлом Res.dat}

{$I-}

Rewrite(F);

{$I+} {открытие файла F1 на запись}

If Ioresult <> 0

Then Writeln(‘на диске нет места’)

Else … (работа с файлом F2)

Close(F1); {закрытие файла F1}

Close(F2); {закрытие файла F1}

Readln;

End.

а) Процедура Assign.

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

Назначение: установление соответствия между файловой переменной и файлом на диске.
Синтаксис: Assign (F, Name), где F – переменная любого файлового типа, Name – строка, содержащая полное имя файла в соответствии с требованиями операционной системы к именам файлов.
Описание работы: процедура Assign устанавливает связь внешнего файла Name с файловой переменной F. Все последующие операции с файловой переменной F будут относиться к внешнему файлу с именем Name. Связь между файловой переменной F и файлом на диске Name существует до тех пор, пока с помощью процедуры Assign не будет установлено соответствие между файловой переменной F и другим внешним файлом.
Примечание: - если указывается не абсолютное имя файла (только имя файла и его расширение), то этот файл программа будет искать только в текущем каталоге, т.е. там же, где расположена сама программа; - для избежания ошибок лучше указывать абсолютное имя файла, начиная с имени диска.

б) Процедура Reset.

Чтению файла с диска должен предшествовать вызов процедуры открытия файла для чтения.

Назначение: открытие существующего файла для чтения.
Синтаксис: Reset (F), где F – файловая переменная.
Описание работы: - процедура Reset, открывает уже существующий файл с именем, связанным с файловой переменной F; - после открытия файла становится доступным только его начальный компонент; - если файл уже открыт, процедура Reset вначале закрывает его, а потом снова открывает; - если с помощью Reset, открывают несуществующий файл, то возникает ошибка.
Примечание: - перед вызовом процедуры Reset должно быть установлено соответствие между файловой переменной F и файлом на диске; - для предотвращения работы с несуществующим файлом используется функция статуса последней выполненной команды ввода/вывода – Ioresult (значение этой функции = 0, если открытие файла для чтения выполнено успешно, т. е. файл на диске существует и соответствие между ним и файловой переменной установлено правильно; значения этой функции ¹ 0 при попытке открыть для чтения несуществующий файл).

В примере 1 для правильной работы функции Ioresult директива {$I-} отключает контроль ошибок ввод/вывода, а директива {$I+} включает контроль ошибок ввода/вывода.

в) Процедура Rewrite.

Записи файла на диск должен предшествовать вызов процедуры открытия файла для записи.

Назначение: открытие файла для записи.
Синтаксис: Rewrite(F), где F – файловая переменная.
Описание работы: - процедура Rewrite создает внешний файл на диске; - если файл с таким именем уже существует, он стирается, и вместо него создается пустой файл; - если файл с тем же именем уже открыт, он закрывается, стирается и создается заново; - если с помощью процедуры Rewrite делается попытка открыть файл для записи при отсутствии на диске места для этого файла, то возникает ошибка.
Примечание: - перед вызовом процедуры Rewrite имя внешнего файла должно быть задано предварительно и при помощи процедуры Assign должно быть установлено соответствие между файловой переменной F и именем файла; - для обнаружения ошибки, связанной с отсутствием места на диске, следует использовать функцию Ioresult (значение этой функции = 0, если файл успешно открыт для записи, и ¹ 0, если файл открыть не удалось).

В примере 1 для правильной работы функции Ioresult директива {$I-} отключает контроль ошибок ввод/вывода, а директива {$I+} включает контроль ошибок ввода/вывода.

г) Процедура Close.

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

Назначение: закрытие файла.
Синтаксис: Close(F), где F – файловая переменная.
Описание работы: процедура Close запрещает доступ к предварительно открытому файлу, т. е. делает его недоступным для чтения/записи.
Примечание: - файл предварительно должен быть открыт для чтения или для записи.

Дополнительно (на усмотрение преподавателя!!!) процедуры Rename и Erase.

д) Процедура Rename.

Назначение: переименование неоткрытого файла.
Синтаксис: Rename(F, NewName), где F – файловая переменная, NewName – НОВОЕ имя файла.
Описание работы: процедура переименовывает неоткрытый существующий файл.
Примечание: - перед вызовом процедуры переименования файла должна быть установлена связь между внешним файлом со старым именем и файловой переменной; - процедуру нельзя использовать для уже открытого файла, т. к. могут возникнуть нежелательные последствия со стороны операционной системы; - переименование осуществляется только для реально существующих файлов, иначе возникает ошибка выполнения программы.

е) Процедура Erase.

Назначение: удаление неоткрытого файла
Синтаксис: Erase(F), где F – файловая переменная.
Описание работы: процедура удаляет указанный файл с диска.
Примечание: - перед вызовом процедуры удаления файла должна быть установлена связь между внешним файлом и файловой переменной; - процедуру нельзя использовать для уже открытого файла, т. к. могут возникнуть нежелательные последствия со стороны операционной системы; - удаление осуществляется только для реально существующих файлов, иначе возникает ошибка выполнения программы.

Пример 2. Удаление или переименование указанного файла.

Program Primer; {заголовок программы}

Uses Crt;

Var

F: Text; {F - файловая переменная}

Ch: Char; {Ch - символьная переменная}

St: String; {St - строковая переменная максимальной длины}

Begin

Clrscr;

Writeln(‘Введите имя файла’); {ввод с клавиатуры имени файла в переменную St}

Readln(St);

Assign(F, St); {установка соответствия между внешним файлом и переменной F }

Write(‘Удалить (У), Переименовать (П), Выход (В)’); {вывод меню}

Readln(Ch); {ввод пункта меню}

Case Ch of {начало оператора выбора}

‘У’, ‘у’: Begin {если выбрано «Удалить», то происходит удаление файла}

Erase(F);

Writeln(‘Файл удален’); {вывод сообщения «Файл удален» на экран}

End;

‘П’, ‘п’: Begin {если выбрано «Переименовать»}

Write(‘Введите новое имя файла: ’); {то ввод с клавиатуры}

Readln(St); {нового имени файла в строковую переменную St}

Rename(F,St); {переименование указанного файла}

Writeln(‘Файл переименован’); {вывод сообщения «Файл переименован»}

End;

‘В’, ‘в’: Halt(1); {если выбран «Выход», то выход из программы}

End;

Readkey;

End. {конец программы}

Текстовые файлы

1. Назначение.

Текстовые файлы предназначены для хранения больших объемов текстовой (символьной) информации. Текстовые файлы представляют собой последовательности символов, объединенные в отдельные строки длиной от 0 до 256 символов. Каждую строку завершает маркер (признак) конца строки. Маркер конца строки представляет собой последовательность из двух символов: символ «возврат каретки» (код символа равен 10) и символ «перевод строки» (код символа равен 13). Эти два символа задают стандартные действия по управлению текстовыми файлами.

 

За последней строкой текстового файла располагается маркер (признак) конца файла.

Текстовые файлы являются файлами последовательного доступа. Это означает, что для считывания (или записи) некоторого компонента необходимо последовательно считать (или записать) все предыдущие компоненты файла с помощью стандартной процедуры чтения из файла (или записи в файл).

2. Описание файловых переменных для текстовых файлов.

Для обращения к текстовому файлу служит файловая переменная, имеющая специальный тип - Тext. Файловые переменные в программе должны быть объявлены в разделе описания переменных следующим образом:

Var <имя>: Text, где <имя> - имя файловой переменной; Техt – стандартный тип текстового файла.

Пример.

Var F: Text;

3. Процедуры и функции работы с текстовыми файлами.

а) К текстовым файлам применимы все процедуры, рассмотренные в Занятии 4:

Assign( F, Name ) – установление соответствия между файловой переменной F и файлом с именем Name;

Reset( F ) – открытие файла, соответствующего файловой переменной F, для чтения;

Rewrite( F ) – открытие файла, соответствующего файловой переменной F, для записи;

Close( F ) – закрытие файла, соответствующего файловой переменной F;

Rename( F, NewName ) – переименование файла, соответствующего файловой переменной F, в файл с именем NewName;

Erase( F ) – удаление файла, соответствующего файловой переменной F.

б) Процедуры Read и Readln.

Для файлов последовательного доступа чтение с диска осуществляется последовательно, компонент за компонентом. Для чтения компонентов текстового файла используются процедуры Read и Readln.

Назначение: чтение файла с диска.
Синтаксис: Read(F, V1, V2, V3, …, VN); Readln(F, V1, V2, V3, …, VN), где F – файловая переменная; V1,…,VN – переменные простого стандартного типа (кроме Boolean) или типа String.
Описание работы: - процедура Read считывает значения переменных из строк файла; - процедура Readln считывает значения переменных из строк файла с последующим переходом на начало новой строки после считывания значения переменной VN; - процедура Readln без списка ввода используется для перехода на начало новой строки файла; - процедуры Read и Readln без указания имени файла считывают данные со стандартного потока ввода, т. е. с клавиатуры; - при считывании текстовых файлов процедуры Read и Readln автоматически преобразует последовательность символов в значения соответствующих переменных.
Примечание: - перед вызовом процедуры чтения файла файл должен быть открыт для чтения при помощи процедуры Reset.

Пример.

Var I: Integer;

F: Text;

Read(F,I); {процедура Read считывает из файла последовательность символов 1, 2, 3 (например), интерпретирует их как одно целое число 123 и присваивает переменной I значение этого числа}

в) Функции Eoln и Eof.

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

Функция Eoln.

Назначение: обнаружение конца строки в текстовом файле.
Синтаксис: Eoln(F), где F – файловая переменная.
Описание работы: функция Eoln возвращает логическое значение True при достижении маркера конца строки и значение False, если конец строки не достигнут.
Примечание: - файл должен быть открыт для чтения до вызова функции.

Функция Eof.

Назначение: обнаружения конца файла.
Синтаксис: Eof(F), где F – файловая переменная.
Описание работы: функция Eoln возвращает логическое значение True при достижении маркера конца файла и значение False, если конец файла не достигнут.
Примечание: - файл должен быть открыт для чтения до вызова функции.

г) Процедуры Write и Writeln.

Для текстовых файлов запись на диск осуществляется последовательно, компонент за компонентом. Для записи компонентов текстового файла используются процедуры Write и Writeln.

Назначение: запись текстового файла на диск.
Синтаксис: Write(F, X1, X2, …, Xm); Writeln(F, X1, X2, …, Xm), где F – файловая переменная, X1, …, Xm – переменные, выражения или константы простого стандартного типа или типа String.  
Описание работы: - процедура Write осуществляет запись компонентов X1, …, Xm, начиная с текущей позиции файла; - процедура Writeln осуществляет запись компонентов X1, …, Xm, начиная с текущей позиции файла, с последующим переходом на начало следующей строки файла (с записью маркера конца строки в файл); - процедура Writeln без списка компонентов используется для перехода на начало следующей строки файла (для записи маркера конца строки в файл); - процедуры Write и Writeln без указания имени файла выводят данные в стандартный поток вывода, т. е. на экран; - при записи текстовых файлов процедура Write автоматически осуществляет перевод внутреннего представления значения переменной, выражения или константы в символьную форму.
Примечание: - перед вызовом процедуры записи файла на диск файл должен быть открыт для записи при помощи процедуры Rewrite или Append (см. далее).

Пример.

Var Y: Integer;

F: Text;

Y:=-315; {процедура Write преобразует число -315 в последовательность}

Write(F,Y);{символов «-», «3», «1», «5» и записывает эту последовательность в файл}

д) Процедура Append.

Назначение: открытие текстового файла на запись (дописывание)
Синтаксис: Append(F), где F – имя файловой переменной типа Text (!!!).
Описание работы: процедура открывает уже существующий текстовый файл и позиционирует указатель на конец файла, после такого открытия текстовый файл можно только дополнять информацией.
Примечание: - ограничения, накладываемые на процедуру Append такие же, как у процедур Reset и Rewrite.

Задача

На диске D находится файл Ved.dat, содержащий следующую информацию:

Необходимо переписать содержимое файла Ved.dat в файл Res.dat на диске D, но без пустых строк, имеющихся в файле Ved.dat.

 

 

Program Files; Uses Crt; Label 1; Var Finp, Fout: Text; Nameinp, Nameout: String; Smv: Char; L: Integer; Begin Textbackground(Magenta); Textcolor(Yellow); Clrscr; Repeat Write(‘Введите имя входного файла >’); Readln(Nameinp); Assign(Finp, Nameinp); {$I-} Reset(Finp); {$I+} Until Ioresult = 0; Write(‘Введите имя выходного файла>’); Readln(Nameout); Assign(Fout, Nameout); {$I-} Rewrite(Fout); {$I+} If Ioresult <> 0 Then Begin Writeln(‘На диске нет места’); Goto 1; End; While not Eof(Finp) Do Begin L:=0; While not Eoln(Finp) Do Begin L:=L+1; Read(Finp, Smv); Write(Fout,Smv); End; Readln(Finp); If L > 0 Then Writeln(Fout); End; Close(Finp); Close(Fout); Writeln(‘Результат смотрите в файле’, 1:Readln; End. {файловые переменные текстовых файлов} {имена файлов} {перем. для счит. и запис. символа} {длина строки файла} {в цикле} {ввод имени входного файла с клавиатуры} {открытие входного файла} { и подготовка его к чтению} {постусловие: файл открыт на чтение удачно} {ввод с клавиатуры имени выходного файла} {открытие выходного файла} {и его подготовка к записи} {если Ioresult ¹ 0} {то вывод сообщения «нет места на диске»} {и выход из программы} {пока не достигнут конец файла} {длина считанной строки равна 0 и} {пока не достигнут конец строки вх файла} {увеличение длины считанной строки на 1} {считывание очередного символа из вх. файла} {запись этого символа в вых. файл} {окончание внутреннего цикла} {перевод строки во входном файле} {если длина считанной строки больше нуля} {то перевод строки в выходном файле} {окончание внешнего цикла} {закрытие входного файла} {закрытие выходного файла} Nameout); {конец программы}

Для данной программы файл Ved.dat является входным файлом, т. к. содержит исходную текстовую информацию, файл Res.dat является выходным, т. к. в него записываются результаты работы программы.

В разделе описаний описаны файловые переменные текстовых файлов Finp и Fout, строковые переменные Nameinp и Nameout для имен входного и выходного файлов и рабочие переменные Smv (считываемый из входного файла символ), L (длина считываемой строки).

Для доступа к входному файлу организуется цикл по считыванию имени входного файла, проверке наличия этого файла на диске и открытию входного файла. Для организации доступа к выходному файлу осуществляется проверка наличия места на диске, при отсутствии места работа программы прекращается и на экран выдается сообщение «На диске нет места».

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

Результаты выполнения программы Files.

Задача 2. На диске D находится файл Dan.dat, содержащий следующую информацию:

Надо создать на диске D текстовый файл Rez.dat, в котором после исходных данных содержатся все положительные числа файла Dan.dat по 5 чисел в строке.

 

Program Files2; Uses Crt; Label 1; Var Finp, Fout: Text; Nameinp, Nameout: String; Smv: Char; X: Real; I: Integer; Begin Textbackground(Magenta); Textcolor(Yellow); Clrscr; Repeat Write(‘Введите имя входного файла >’); Readln(Nameinp); Assign(Finp, Nameinp); {$I-} Reset(Finp); {$I+} Until Ioresult = 0; Write(‘Введите имя выходного файла>’); Readln(Nameout); Assign(Fout, Nameout); {$I-} Rewrite(Fout); {$I+} If Ioresult <> 0 Then Begin Writeln(‘На диске нет места’); Goto 1; End; While not Eoln(Finp) Do Begin Read(Finp, Smv); Write(Fout, Smv); End; Readln(Finp); Writeln(Fout); While not Eof(Finp) Do Begin While not Eoln(Finp) Do Begin Read(Finp, X); Write(Fout, X:7:2); End; Readln(Finp); Writeln(Fout); End; Close(Finp); Writeln(Fout); Writeln(Fout, ‘ РЕЗУЛЬТАТ’); Reset(Finp); Readln(Finp); I:=1; While not Eof(Finp) Do Begin While not Eoln(Finp) Do Begin Read(Finp, X); If X > 0 Then Begin Write(Fout, X:7:2); If (I mod 5) = 0 Then Writeln(Fout); I:=I+1; End; End; Readln(Finp); End; Close(Finp); Close(Fout); Writeln(‘Результат смотрите в файле’, 1:Readln; End. {файловые переменные текстовых файлов} {имена файлов} {считываемый из входного файла символ} {считываемое из вх. файла веществ. число} {в цикле} {ввод имени входного файла с клавиатуры} {открытие входного файла} { и подготовка его к чтению} {постусловие: файл открыт на чтение удачно} {ввод с клавиатуры имени выходного файла} {открытие выходного файла} {и его подготовка к записи} {если Ioresult ¹ 0} {то вывод сообщения «нет места на диске»} {и выход из программы} {пока не достигнут конец 1-ой строки} {чтение текста из входного файла} {(первая строка «ИСХОДНЫЕ ДАННЫЕ»)} {и запись его в выходной файл} {конец цикла} {перевод строки во входном файле} {перевод строки в выходном файле} {пока не достигнут конец входного файла} {пока не достигнут конец строки вх. файла} {чтение информации из входного файла} {и запись в выходной файл (формат вывода!)} {конец внутреннего цикла} {перевод строки во входном файле} {перевод строки в выходном файле} {конец внешнего цикла} {закрытие входного файла} {перевод строки в выходном файле} {вывод в вых. файл строки “ РЕЗУЛЬТАТ”} {открытие вх. файл на чтение (еще раз)} {пропуск текста во вх. файле (1-ой строки)} {количество чисел в строке выходного файла} {пока не достигнут конец вх. файла} {пока не достигнут конец строки вх. файла} {чтение числа из вх. файла в переменную Х} {если Х > 0} {то запись числа в вых файл (формат!)}


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: