Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль (ст 33).doc
Скачиваний:
3
Добавлен:
13.11.2019
Размер:
821.76 Кб
Скачать

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

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, содержащий следующую информацию:

Группа ФТ-10

-------------------

Список студентов, получающих стипендию

----------------------------------------------------------

1. Артемов В. В.

2. Васильев А. А.

3. Петров В. П.

4. Смирнов И. И.

Необходимо переписать содержимое файла 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 (длина считываемой строки).

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

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

Группа ФТ-10

-------------------

Список студентов, получающих стипендию

----------------------------------------------------------

1. Артемов В. В.

2. Васильев А. А.

3. Петров В. П.

4. Смирнов И. И.

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

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

ИСХОДНЫЕ ДАННЫЕ

1.1 -10. -5.8 -11. 2.3 4. 5. 6.

-3.12 9.01 8. -12. -12.

-1. -1. -1.

2. 3. 4. 5. 6.

Надо создать на диске 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}

{то запись числа в вых файл (формат!)}

{если в строке уже 5 чисел}

{то перевод строки в вых. файле}

{увеличение кол-ва чисел в строке на 1}

{конец внутреннего цикла}

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

{конец внешнего цикла}

{закрытие входного файла}

{закрытие выходного файла}

Nameout);

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

ИСХОДНЫЕ ДАННЫЕ

1.10 -10.00 -5.80 -11.00 2.30 4.00 5.00 6.00

-3.12 9.01 8.00 -12.00 -12.00

-1.00 -1.00 -1.00

2.00 3.00 4.00 5.00 6.00

РЕЗУЛЬТАТ

1.10 2.30 4.00 5.00 6.00

9.01 8.00 2.00 3.00 4.00

5.00 6.00

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

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

Program Primer;

Uses Crt;

Var

Finp, Fout : Text;

Nameinp, Nameout : String;

i : Integer;

A, B : Array[1..30] of Integer;

Begin

i:=1;

While not Eof(Finp)

Do Begin

While not Eoln(Finp)

Do Begin

Read(Finp, A[i]);

I:=I+1;

End;

Readln(Finp);

End;

Close(Finp);

For i:=1 to 30

Do Begin

Write(Fout, B[i]:7:2);

If (I mod 5) = 0

Then Writeln(Fout);

End;

Close(Fout);

{открытие на чтение входного файла}

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

{закрытие входного файла}

{обработка массива}

{закрытие выходного файла}

В процедурах Read (Readln) и Write (Writeln) можно использовать только переменные, выражения или константы простого стандартного типа или типа String, поэтому можно считать компонент текстового файла в элемент массива и записать элемент массива в текстовый файл.