Стандартные текстовые файлы input и output

Любой программе доступны без описания стандартные текстовые файловые переменные input и output. Input (ввод) — это доступный только по чтению файл, используемый для ввода с клавиатуры. Output (вывод) — доступный только по записи файл, используемый для вывода на дисплей. Чтобы убедиться, что такие файловые переменные действительно существуют, вы можете выполнить такую программу:

begin writeln(output,’Привет’); readln(input); end.

Перед началом выполнения программы файлы input и output автоматически открываются, как если бы были выполнены следующие операторы: assign(input,''); reset(input); и

assign(output,''); rewrite(output);

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

Файлы input и output и все файлы, которым присвоено пустое имя, ссылаются на устройство консоль. Конечно, имя con можно было бы записать и явно, но пустое имя короче.

Этими стандартными файлами можно с успехом пользоваться при работе с текстовыми файлами. Дело в том, что их можно связать и с любыми двумя текстовыми файлами на диске, и тогда процедуры read (readln) и write (writeln) будут работать не с консолью, как обычно, а с заданными файлами на диске, которые при этом будут автоматически открываться и закрываться.

Например:

Var a,b: integer;

begin

assign(input, 'input.txt'); {связали input с файлом input.txt }

readln(a,b); {прочитали две переменные из файла, а не с клавиатуры}

assign(output, 'output.txt'); { связали output с файлом output.txt }

writeln(b,a); {записали переменные в файл, а не вывели на экран}

end.

Если файл input.txt действительно содержит в первой строке два целых числа, то после выполнения программы в текущем каталоге появится файл output.txt, содержащий эти числа в обратном порядке. И никаких файловых переменных описывать не потребовалось. Неплохо?

Этой возможностью обычно пользуются на олимпиадах по программированию, поскольку при автоматической проверке задач исходные данные передаются программе из файла, а программа обязана послать результаты в другой файл, который и будет проверяться. При отладке программы, когда требуется работать с консолью, используют assign(input,''); assign(output,'');

Возможен и другой вариант — связать произвольную файловую переменную с консолью. Например:

var f : text; str: string;

begin

assign(f, ''); reset(f); readln(str); close(f);

assign(f, ''); rewrite(f); writeln(f, 'Вы ввели: ',str); close(f);

end.

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

Пример Поиск в существующем файле все строки, содержащие набор символов, вводимых с клавиатуры. Результат поиска выводится на экран и одновременно записывается в файл с именем analysis.txt.

const sum: word=0; { счетчик: сколько раз нашли }

var f1,f2: text; name,str,search: string[80];

begin

write('Введите имя файла: '); readln(name);

write('Введите строку поиска: '); readln(search);

assign(f1,name);assign(f2,'analysis.txt');

reset(f1); rewrite(f2); { открываем f1 и создаем f2 }

writeln('Протокол поиска:'); writeln(f2,'Протокол поиска:');

while not eof(f1) do { пока не конец файла f1, выполняем цикл }

begin

readln(f1,str); { вводим строку str из файла f1 }

if pos(search,str)>0 then

begin { ищем search в str }

inc(sum); writeln('Найдено (раз):',sum);

writeln(str); { вывод на экран }

writeln(f2,str); { вывод в файл }

end;

end;

close(f1); close(f2); readln; { закрываем файлы }

end.

Пример: Ввод с клавиатуры, в начало заданного файла. Открытие файла для дозаписи процедурой append используется только в том случае, если текст добавляется в конец файла, поэтому нам пришлось создать временный файл (это типовой прием), в который сначала помещается добавляемый текст, а затем текст из заданного файла.

var ftmp,f: text; { файловые переменные }

txtbuf: string; { текстовый буфер }

name: string; { имя файла }

ok: boolean; ch: char;

function fileexists(filename : string): boolean;

{ если файл существует в текущем каталоге, функция возвращает true, }

var f: file;

begin

{$i-} assign(f, filename); reset(f); {$i+}

fileexists:=(ioresult=0)and(filename<>'');close(f);

end;

begin

{ запись текста во временный файл на диск }

assign(ftmp,'tmpfile.txt'); rewrite(ftmp);

writeln('Вводите текст для записи. Окончание - <Enter>:');

repeat

write('->'); readln(txtbuf); writeln(ftmp, txtbuf);

until txtbuf=''; { окончание текста — двойное нажатие <Enter> }

close(ftmp); writeln('Ввод окончен');

repeat { проверка существования файла }

write('Введите имя файла для добавления: '); readln(name);

ok:=fileexists(name);

if not ok then writeln('Файл ',name,' не найден');

until ok;

writeln('Файл ',name,' найден в текущем каталоге');

assign(f,name); reset(f); { открыли файл f }

append(ftmp); { текст из файла f добавляем в конец временного файла }

while not eof(f) do

begin

{ пустые строки читаются, но не записываются }

readln(f, txtbuf);

if txtbuf<>'' then writeln(ftmp,txtbuf);

end;

close(f); close(ftmp);

writeln('Введенный текст добавлен в начало файла ',name);

writeln('Сделайте выбор:');

writeln('Удалить старый файл, без резервной копии - E/e (erase)');

writeln('Удалить старый файл, создав bak-файл - B/b (backup)');

writeln('Выйти - H/h (halt)');

readln(ch);

case ch of

'E','e':

begin

{ удалили старый файл и переименовали временный }

erase(f); rename(ftmp,name);

end;

'B','b':

begin

txtbuf:=name; delete(txtbuf,length(txtbuf)-3,4);

rename(f,txtbuf+'.bak'); {переименовали старый файл в bak}

rename(ftmp,name); {переименовали временный файл}

end;

'H','h':halt;

end;

end.

Структура модуля

Исходный текст любого модуля можно разделить на несколько разделов:

q заголовок;

q интерфейсная часть;

q исполняемая часть;

q инициирующая часть.

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

В общем виде структура модуля выглядит так:

unit <имя>; { заголовок модуля }

{$R+} { возможно, глобальные директивы компилятора}

interface { начало интерфейсной части }

uses … { список модулей }

label … { объявления общедоступных меток }

const … { объявления общедоступных констант }

tуре … { объявления общедоступных типов }

var … { объявления общедоступных переменных }

procedure… { заголовки общедоступных процедур }

function … { заголовки общедоступных функций }

implementation { начало исполняемой части }

uses … { используемые при реализации модули }

label … { объявления скрытых глобальных меток }

const … { объявления скрытых глобальных констант }

tуре … { объявления скрытых глобальных типов }

var … { объявления скрытых глобальных переменных }

procedure … { заголовки и тела общедоступных и скрытых процедур }

function … { заголовки и тела общедоступных и скрытых функций }

begin { начало инициирующей части }

. . . . . { здесь могут располагаться любые операторы }

end. { конец модуля }

На практике обычно отсутствуют какие-либо объявления, и в целом структура получается проще.

Замечания

В Delphi состав модуля немного расширен. Во-первых, инициирующая часть теперь начинается служебным словом initialization, во-вторых, добавилась еще одна заключительная часть с ключевым словом finalization, которая выполняется при завершении программы. Например, если в инициирующей части открывается какой-то нужный служебный файл, то в заключительной он должен закрыться. В целом назначение частей модуля не изменилось.

Следует знать:

q имя модуля служит для его связи с другими модулями и основной программой, поэтому заголовок модуля опускать нельзя (в отличие от заголовка программы);

q имя модуля должно совпадать с именем того файла, в который помещается исходный текст модуля. Если, например, имеем заголовок unit triangle, то исходный текст соответствующего модуля должен размещаться в файле Triangle.pas, что очень важно;

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

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

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

q инициирующая часть завершает модуль. Она может отсутствовать вместе с начинающим ее словом begin или быть пустой — тогда за begin сразу следует признак конца модуля end. (с точкой);

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

Замечание

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

Для подключения модуля к программе или другому модулю используется предложение: uses список модулей;

В программе оно располагается до начала других объявлений.

Например, uses crt, graph, triangle;

Пример: Разработаем модуль triangle, содержащий набор процедур и функций для выполнения расчета треугольников, используя известные формулы из геометрии. При этом предусмотрим два наиболее часто встречающиеся способа задания треугольника: по трем сторонам и по координатам его вершин. Модуль позволяет выполнить следующие действия:

q вычисление сторон по координатам вершин треугольника;

q проверка существования треугольника;

q расчет площади и периметра;

q расчет радиусов вписанной и описанной окружности.

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

unit triangle;

interface

{ вычисление сторон треугольника по координатам вершин }

procedure getabc (xa,ya,xb,yb,xc,yc:real; var a,b,c:real);

{ проверка существования данного треугольника }

function exist(a,b,c:real):boolean;

{ вычисление периметра }

function perimetr(a,b,c:real):real;

{ вычисление площади }

function square(a,b,c:real):real;

{ вычисление радиуса вписанной окружности }

function rv(a,b,c:real):real;

{ вычисление радиуса описанной окружности }

function ro(a,b,c:real):real;

{ исполняемая часть, использующая известные из геометрии формулы }

implementation

{ скрытая функция для вычисления расстояния между двумя точками }

function len(x1,y1,x2,y2:real):real;

begin

len:=sqrt(sqr(x1-x2)+sqr(y1-y2));

end;

procedure getabc;

begin

a:=len(xa,ya,xb,yb);

b:=len(xb,yb,xc,yc);

c:=len(xc,yc,xa,ya);

end;

function exist;

begin

exist:=(a<b+c) and (b<a+c) and (c<a+b);

end;

function perimetr;

begin

perimetr:=a+b+c;

end;

function square;

var p:real;

begin

p:=(a+b+c)/2; { определение p – полупериметра }

square:=sqrt(p*(p-a)*(p-b)*(p-c)); { определение площади }

end;

function rv;

begin

rv:=square(a,b,c)/perimetr(a,b,c)*2;

end;

function ro;

begin

ro:=a*b*c/4/square(a,b,c);

end;

begin

{ инициирующая часть отсутствует }

end.

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

q у которого из участков длиннее забор (забор — строго по периметру);

q на каком из участков можно разместить больше растений (считаем, что их количество прямо пропорционально площади);

q на котором из них можно разместить идеально круглую клумбу наибольшего размера (оценим по радиусам вписанных окружностей).

uses triangle;

var xa,ya,xb,yb,xc,yc,

xd,yd,xe,ye,xf,yf,a,b,c,d,e,f: real;

begin

writeln('Введите координаты вершин первого участка');

readln(xa,ya,xb,yb,xc,yc);

getabc(xa,ya,xb,yb,xc,yc,a,b,c);

if not exist(a,b,c) then

writeln('Такого участка не существует')

{ все вершины лежат на одной прямой }

else { первый участок существует }

begin

writeln('Введите координаты вершин второго участка');

readln(xd,yd,xe,ye,xf,yf);

getabc(xd,yd,xe,ye,xf,yf,d,e,f);

if not exist(d,e,f) then

writeln('Такого участка не существует')

else { оба участка существуют }

begin

if perimetr(a,b,c)>perimetr(d,e,f) then write('У первого')

else write('У второго');

writeln(' участка забор длиннее');

if square(a,b,c)>square(d,e,f) then write('На первом')

else write('На втором');

writeln(' участке поместится больше растений');

if rv(a,b,c)>rv(d,e,f) then write('На первом')

else write('На втором');

writeln(' участке поместится самая большая круглая клумба');

end;

end; readln

end.

Практическое задание

Задания 1

1. Заданы два текстовых файла x.txt и y.txt. Создайте третий файл z.txt, в который поместите сначала все строки файла x.txt, затем все строки файла y.txt. Подсчитайте число строк в полученном файле. Выведите на экран все самые длинные и самые короткие строки.

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

3. Заданы два текстовых файла, состоящие из целых чисел, упорядоченных по возрастанию. Необходимо объединить их вместе таким образом, чтобы в полученном файле числа оказались также упорядоченными по возрастанию.

4. Задан текстовый файл, состоящий из строк с числами. Найдите в файле строку, числа в которой упорядочены по возрастанию, и выведите ее на экран. Если таких строк несколько, то выведите все.

5. Задан текстовый файл с произвольным именем. Создайте программу для выравнивания его строк. Программа должна найти в файле строку максимальной длины и удлинить все строки с меньшей длиной путём вставки дополнительных пробелов между словами. Полученный текст запишите в новый файл.

6. Задан символьный файл. Считая, что количество символов в одном слове не больше 15, определите: сколько в файле имеется слов, состоящих из одного, двух, трёх и т. д. символов; изобразите гистограмму (столбчатую диаграмму) длин всех слов.

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

8. Задан символьный файл. Определите, сколько раз в заданном файле встречается каждая буква алфавита

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

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

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

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

13. Создайте типизированный файл вещественных чисел. Задайте с клавиатуры номер компоненты N, с которой необходимо удалить K элементов файла. Выведите компоненты исходного и усеченного файлов. Дополнительный файл для решения задачи не использовать.

14. Создайте типизированный файл вещественных чисел. Задайте с клавиатуры номер компоненты N, после которой необходимо вставить K элементов файла. Выведите компоненты исходного и дополненного файлов.

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

Задание 2

1. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. подсчитать количество слов в заданной строке

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

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

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

2. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

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

Б. Удаление лишних пробелов (между словами оставить по одному пробелу)

В. Удаление всех пробелов в строке

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

3. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Подсчитать в заданной строке количество слов.

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

В. Заменить все цифры знаками подчеркивания.

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

4. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Подсчитать в заданной строке количество повторений заданного символа

Б. Удалить из заданной строки заданный символ везде, где он встречается.

В. В заданной строке заменить один заданный символ на другой заданный символ.

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

5. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Удалить из заданной строки все знаки препинания.

Б. Заменить в заданной строке все цифры на пробелы.

В. Выделить первое слово заданной строки.

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

6. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Подсчитать в заданной строке размер самого первого слова.

Б. Подсчитать в заданной строке размер самого длинного слова.

В. Удалить из заданной строки слово с заданным номером.

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

7. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Заменить в заданной строке все строчные буквы на заглавные.

Б. Заменить в заданной строке все заглавные буквы на строчные.

В. Удалить все знаки препинания.

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

8. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. удалить пробелы в начале строки и в конце строки

Б. Удалить лишние пробелы (между словами оставить по одному пробелу)

В. Удвоить все пробелы в строке

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

9. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Заменить в заданной строке все строчные буквы на заглавные.

Б. Заменить в заданной строке все заглавные буквы на строчные.

В. Удалить все цифры.

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

10. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Подсчитать количество букв в последнем слове заданной строки

Б. Заменить в заданной строке все заглавные буквы на строчные.

В. Удалить все знаки препинания.

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

11. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Заменить в заданной строке все строчные буквы на заглавные.

Б. Заменить в заданной строке все заглавные буквы на строчные.

В. Удалить все знаки препинания.

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

12. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. удалить пробелы в начале строки и в конце строки

Б. Удалить лишние пробелы (между словами оставить по одному пробелу)

В. Удвоить все пробелы в строке

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

13. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. подсчитать количество слов в заданной строке

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

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

14. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Заменить в заданной строке все строчные буквы на заглавные.

Б. Заменить в заданной строке все заглавные буквы на строчные.

В. Удалить все знаки препинания.

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

15. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:

А. Подсчитать в заданной строке количество слов.

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

В. Заменить все цифры знаками подчеркивания.

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

Наши рекомендации