Лекция №6.2: Ввод и вывод информации: текстовые файлы

страницы: 1 2 3 4

Содержание

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

Открытие файла

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

Reset(f);

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

Append(f);

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

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

Close(f);

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

Считывание из файла

Чтение данных из файла, открытого для считывания, производится с помощью команд Read() и ReadLn(). В скобках сначала указывается имя файловой переменной, а затем — список ввода1. Например:

Read(f, a, b, c);

— читать из файла f три переменные a, b и c. После выполнения этой процедуры указатель в файле передвинется за переменную с;

ReadLn(f, a, b, c);

— читать из файла f три переменные a, b и c, а затем перевести указатель («курсор») на начало следующей строки; если кроме уже считанных переменных в строке содержалось ещё что–то, то этот «хвост» будет проигнорирован.

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

Если же символ конца строки встретится где–нибудь между переменными, указанными в списке ввода, то обе процедуры его просто проигнорируют.

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

Считываемые переменные могут иметь различные типы. Например, если в файле3 f записана строка

1 2.5 с

то командой Read(f, a, b, c, c); можно прочитать одновременно значения для трёх переменных, причем все — разных типов:

a : Byte;
b : Real;
c : Char;

Замечание: Обратите внимание, что символьную переменную c пришлось считывать дважды, так как после числа «2.5» сначала идет символ пробела и только затем буква «c».

Из файла невозможно считать переменную составного типа (например, если а — массив, то нельзя написать Read(f, a), можно ввести его только поэлементно, в цикле), файлового, а также логического.

Особенно внимательно нужно считывать строки (String[length] и String): эти переменные «забирают» из файла столько символов, сколько позволяет им длина (либо вплоть до ближайшего конца строки). Если строковая переменная неопределённой длины (тип данных String) является последней в текущей строке файла, то никаких проблем с её считыванием не возникнет. Но в случае, когда необходимо считывать переменную типа String из начала или из середины строки файла, это придётся делать с помощью цикла — посимвольно. Аналогичным образом — посимвольно, от пробела до пробела — считываются из текстового файла слова.

Есть ещё один, гораздо более трудоемкий способ: считать из файла всю строку целиком, а затем «распотрошить» её — разобрать на части специальной процедурой выделения подстрок Copy(). После чего (где необходимо) применить процедуру превращения символьной записи числа в само число, применяя стандартную процедуру Val(). Кроме того, совсем не очевидно, что длина вводимой строки не будет превышать 255 символов, поэтому такой способ приходится признать неудовлетворительным.

Запись в файл

Сохранять переменные в файл, открытый для записи командами Rewrite(f) или Append(f), можно при помощи команд Write() и WriteLn(). Так же, как в случае считывания, первой указывается файловая переменная, а за ней — список вывода:

Write(f, a, b, c);

— записать в файл f переменные a, b и c;

WriteLn(f, a, b, c);

— записать в файл f переменные a, b и c, а затем записать туда же символ «конец строки».

Выводить в текстовый файл можно переменные любых базовых типов (вместо значений логического типа выведется их строковый аналог TRUE или FALSE) или строки.

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

страницы: 1 2 3 4

Примечания

  1. ^ См. лекцию 1.
  2. ^ См. лекцию 2.
  3. ^ Более правильно было бы сказать: «в файле, подключённом к файловой переменной f», однако для краткости здесь и далее мы будем использовать упрощённый вариант, полагая, что это не вызовет никаких недоразумений.
Код для вставки: :: :: :: ::
Поделиться: // //