Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
posobie.doc
Скачиваний:
27
Добавлен:
31.03.2015
Размер:
1.43 Mб
Скачать

3.2. Использование текстовых файлов для хранения входных и выходных данных

Символьные и строковые данные(опережающие, но полезные сведения; так, сведения о символах пригодятся в задаче упорядочения).

•• Символьная константа: ‘<символ>’ (например, ‘a’, ’4’).

Описание символьной переменной:

  • в псевдокоде: симв <имя>;

  • в Паскале: Var <имя>:char;

Возможное значениесимвольной переменной: любой символ, представленный в таблице символов.

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

•• Строковая константа(строка): ‘<последовательность символов>’ (например, ‘Это строка’, ’а = 4’).

Описание строковой переменной:

  • в псевдокоде: строка <имя>;

  • в Паскале: Var <имя>:string[<длина>]; <длина> не должна превышать 255 и может быть опущена; в этом случае она принимается равной 255.

Возможное значениестроковой переменной: любая последовательность символов из таблицы символов длины не более 255.

Строки в данном пособии представлены только строковыми константами, используемыми при выводе текстовых сообщений. Так, при разработке внешней спецификации задачи «Точки в круге» в выходной форме предусмотрены такие сообщения, а в тексте программы они внесены в список объектов вывода как строковые (или текстовые) константы (§ 2.1).

Маленький пример:

var

a,b,c:char;

stroka:string[6];

d: integer;

begin

{задание значений переменным}

a:=’m’;

b:=’ ‘; {b присваивается значение пробела}

c:=’p’;

stroka:=’pascal’;

{сравнение символов}

if (a>с) then

d:=0

else

d:=1; {d=1}

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

writeln(‘Результат сравнения:d=’,d:1,’ Язык:’,b,stroka);

{Выведется строка: Результат сравнения: d=1 Язык: pascal }

…………………

● Определение файла

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

● Логическое и физическое представление файла

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

  • физическом; этособственно файлс данными на внешнем носителе (диске); идентифицируется именем согласно правилам операционной системы (MS DOS, Windows и т.д.);

  • логическом; этопредставление файла в программе, зависящее от правил языка программирования.

В Паскале файл в программе представляется файловой переменной, имя которой строится по обычным правилам Паскаля.

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

● Связь логического и физического представлений

Соответствие между физической и логической организацией устанавливается специальным оператором языка, связывающим физическое имя файла с файловой переменной. С этого момента программа имеет дело только с файловой переменной, и термин «файл» применительно к операторам обработки файлов относится к файловой переменной(т.е. текст «чтение из файлаf» озачает: «чтение из файла, представленного файловой переменнойf»). Этот оператор:

assign( <ф.п.>,’<имя файла>’);

Здесь и далее ф.п. – сокращение термина «файловая переменная».

Типы файлов

В языке Паскаль существует три вида файлов: текстовые, типизированные, нетипизированные (бестиповые).

Самый общий и простой в использовании – текстовый тип; именно его и будем чаще всего использовать.

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

● Структура файла

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

Изобразим файл в виде полосы последовательно расположенных байтов. Любой файл заканчивается символом конца файла eof(end of file).

Типизированный файл

Все компоненты (минимальные считываемые или записываемые единицы) такого файла принадлежат к одному типу; тип может быть любым, кроме файлового:

Компоненты размещены непосредственно один за другим.

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

Описаниефайловой переменной:

var <ф.п.>:file of <тип компонентов>;

Значениефайловой переменной - файл с компонентами заданного типа.

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

Текстовый файл– совокупность строк (последовательностей символов) переменной длины, заканчивающихся специальным символомeoln(end of line, конец строки; на клавиатуре набирается нажатием клавиши Enter):

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

Для хранения данных последние записываются в файл на внешнем запоминающем устройстве (диске).

Описание файловой переменной:

var

<ф.п.>:text;{text- стандартный тип}

Стандартные файловые переменные – input(по умолчанию связана с клавиатурой) иoutput(по умолчанию связана с дисплеем).

● Специфика текстовых файлов

Компоненты-строки представлены во внешнем (символьном) виде: каждый байт являет собой код согласно таблице кодов.

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

Числа разделяются пробелами и/или символами eoln.

Символы считываются подряд (eoln– тоже символ!). Строки считываются согласно соответствующим правилам. В данном пособии ввод символов и строк не рассматривается.

Преимущества текстовых файлов:

  • простота создания (непосредственный набор данных на клавиатуре);

  • наглядность (непосредственный просмотр средствами текстовых редакторов);

  • универсальность (можно обойтись только этим видом файлов).

● Основные операторы для работы с файлами

reset ( <ф.п.> )– открытие для чтения файла, связанного с файловой переменной <ф.п.>;

rewrite( <ф.п.> )– создание и открытие нового файла для записи;

close( <ф.п.> )– закрытие открытого файла;

read( <ф.п.>,<список ввода>)– чтение данных; элемент списка ввода для текстового файла – числовая или символьная или строковая переменная;

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

● Особенности ввода-вывода при работе с текстовыми файлами

Вводятся и выводятся: числа, символы, строки. Об этом уже было сказано выше.

Операторы ввода-вывода:

read( <ф.п.>,<список ввода>)– то же, что выше; чтение данных подряд;

readln( <ф.п.>,<список ввода>)– чтение данных согласно списку ввода и переход на следующую строку; если в строке данных остались данные, не вошедшие в список ввода, они игнорируются;

write( <ф.п.>,<список вывода>)- то же, что выше; вывод данных подряд;

writeln( <ф.п.>,<список вывода>) - запись данных в файл согласно списку вывода с добавлением в конце выведенной строки маркера конца строки (переход на следующую строку).

Пример использования файловв задаче «Точки в круге»

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

•• Файл task440.datдолжен быть создан согласно входной форме до запуска программы с помощью любого редактора текстов. В данном случае следует набрать только значения входных данных, опустив приглашения.

Так, содержимое файла task440.datдля первого теста будет иметь вид:

•• Файл task440.resбудет создан автоматически. При правильной записи операторов вывода вид содержимого файла должен полностью совпадать с выходной формой.

• Изменения и добавления в программе отметим в ее тексте, сопроводив пояснениями.

program points (dat,res); {ввод из файла, вывод в файл}

uses crt; {подключение модуля для работы с экраном}

{раздел определения констант}

const

nmax=100; {верхняя граница массива}

{раздел описания типов - пустой}

{раздел описания переменных}

var

n,i:integer;

r,p,sa:real;

x,y:array[1..nmax] of real;

dat,res:text;

{раздел операторов}

begin

clrscr; {очистка экрана}

assign (dat,’points1.dat’); reset (dat);

assign (res,’points1.res’); rewrite (res);

{A0.1 - ввод-вывод входных данных}

{вывод заголовка в выходной документ}

writeln(res,' ':9,'Точки'); {вывод c переходом на следующую строку}

{ввод входных данных}

writeln('Количество точек n:');readln(dat,n); {обр1.1,1.2}

writeln('Критическое удаление r:');readln(dat,r); { обр2.1,2.2}

{ввод массивов x и y}

writeln(res,'Абсциссы и ординаты:'); {обр3}

fori:=1tondo

readln(dat,dat,x[i],y[i]); {обр4: ввод 2 элементов и переход на след. строку}

{вывод входных данных в выходной документ}

{вывод n, r по обр6}

writeln(res,' Количество точек =',n:3);

writeln(res,' Критическое удаление = ',r:4:1);

{вывод массивов x и y}

writeln(res,' Абсциссы и ординаты: '); {обр7}

for i:=1 to n do

writeln(res,' ':5,x[i]:5:1,' ':8,y[i]:5:1); {обр8}

{A0.2. Обработка}

…………………….

{A0.3 - вывод результатов}

writeln(res,' Искомый процент точек = ',p:4:1); {p по обр9}

writeln(res,' Среднее удаление = ',sa:4:1); {sa по обр9}

close(dat); close(res);

end.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]