45902 (607777), страница 4
Текст из файла (страница 4)
Открываем файл необходимой нам процедурой;
Включаем вывод ошибок {$I+} - пусть будет для дальнейшего отслеживания таковых;
Проверяем, если IOResult возвращает нуль, то все было путем и файл открыт. Иначе выводим ошибку.
Вот пример такой программы:
var |
T: Text; |
S: String; |
begin |
Write('Enter filename: '); |
Readln(S); |
Assign(T, S); |
{$I-} |
Reset(T); { открываем файл для чтения } |
{$I+} |
if IOResult <> 0 then { если не нуль, то была ошибка } |
begin |
Write('Error when open file!'); |
Halt; |
end; |
{ иначе все в порядке, продолжаем } |
.......... |
end. |
Закрытие файла
Выше я говорил о том, зачем нужно закрывать файл и когда надо это делать. Закрытие файла производиться с помощью процедуры Close(F), где F - это переменная файлового типа. Эта процедура одна для всех типов файлов.
Запись и чтение файлов. Часть I
Сегодня я хочу рассказать о записи и чтении текствых и типизированных файлов, в следующем выпуске рассказ пойдет о чтении файлов без типа. Итак, переходим к непосредственной обработке файловой информации.
Чтение файлов. Чтение файлов производится с помощью отлично известных нам процедур Read и Readln. Они используются также, как и при чтении информации с клавитуры. Отличие лишь в том, что перед переменной, в которую помещается считанное значение, указывается переменная файлового типа (дескриптор файла):
Read(F, C);
Здесь F - дескриптор файла, C - переменная (Char, String - для текстовых, любого типа - для типизированных файлов).
Также сразу хочу упомянуть о одной, пожалуй самой главной функции при чтении файлов. Это функция поверки на конец файла - Eof(F): Boolean;. В качестве параметра - файловая переменная любого типа. Функция возвращает TRUE если достигнут конец файла и FALSE иначе. Здесь все очень просто, демонстрации ради давайте напишем небольшую программку. Пусть имеем текстовый файл. Давайте его распечатаем и заодно посчитаем, например, количество пробелов:
var |
T: Text; |
С: Char; |
Spaces: Word; |
S: String[79]; { 79-макс. длина пути в DOS } |
begin |
Write('Enter filename: '); |
Readln(S); |
Assign(T, S); |
{ открываем файл для чтения } |
{$I-} |
Reset(T); |
{$I+} |
{ если не нуль, то была ошибка } |
if IOResult <> 0 then |
begin |
Write('Error when open file ', S, ' !'); |
Halt; |
end; |
{ иначе все в порядке, продолжаем } |
{ ЦИКЛ: пока НЕ КОНЕЦ ФАЙЛА } |
While (not Eof(T)) do |
begin |
{ читаем из файла переменную } |
Read(T, C); |
{ если пробел, увеличиваем счетчик } |
If C = ' ' then Inc(Spaces); |
Write(C); |
end; |
Writeln('КОЛИЧЕСТВО ПРОБЕЛОВ: ', Spaces); |
Readln; |
end. |
Думаю, здесь все ясно. Продолжаем двигаться дальше и посмотрим, как производиться запись в файлы.
Запись в файлы. Вы еще не догадались? Запись в файлы производиться точно так же, как и запись на экран - с помощью процедур Write и Writeln. Как и в случае с чтением, перед записываемой в файл переменной указывается тескриптор файла:
Write(F, S);
Здесь F - дескриптор, S - переменная.
При этом, естественно, переменная должна соответствовать типу файла. Примера ради давайте составим еще одну небольшую программку, которая покажет работу с файлами. На сей раз уже используем типизированные файлы, а именно состоящие из чисел. Итак, мы имеем файл, в котором содержаться числа типа Integer. Давайте отсортируем эти числа в файле по возрастанию.
План дейтсвий:
Отрываем типизированный файл из Integer; (проверяем на ошибку и т.п.)
Читаем все числа в массив (считываем, пока не конец файла)
Сортируем массив по возрастанию;
Записываем отсортированный массив обратно в файл.
Получается такая программа:
Program Sorting; |
uses Crt; |
var |
F: File of Integer; |
I, J, M: Word; |
Mas: Array[1..500] of Integer; |
S: String; |
begin |
ClrScr; |
Write('Enter filename: '); |
Readln(S); |
{ открываем файл } |
Assign(F, S); |
{$I-} |
Reset(F); |
{$I+} |
if IOResult <> 0 then |
begin |
Write('Error when open file!'); |
Halt; |
end; |
{ пока не конец файла, читаем массив } |
While (not Eof(F)) do |
begin |
Inc(M); |
Read(F, Mas[M]); |
Write(Mas[M], ' '); |
end; |
{ сортируем массив по возрастанию } |
For I := 1 to M do |
For j := 1 to M do |
if Mas[I] < Mas[J] then |
begin |
inc(mas[j], mas[i]); |
mas[i] := mas[j]-mas[i]; |
dec(mas[j], mas[i]); |
end; |
Writeln; Writeln('============================================='); |
{ перезаписываем файл } |
ReWrite(F); |
For I := 1 to 100 do |
begin |
Write(Mas[I], ' '); |
Write(F, Mas[i]); |
end; |
Writeln; Write('Elements in file: ', M); |
Close(F); |
Readln; |
end. |
Программа очень проста и хорошо демонстрирует работу с типизированными файлами. В качестве сортировки массива я использую метод пузырька, чтобы перезаписать файл использую ReWrite. Вроде не должно возникать никаких сложностей... Будут проблемы, пишите. Ну а на сегодня, пожалуй, все. Этой информации вам будет достаточно, в следующем выпуске займемся, как я уже сказал, нетипизированными файлами и продолжим писать программу "Записная книжка".
Список литературы
Для подготовки данной работы были использованы материалы с сайта http://bestcode.org/